結果
| 問題 |
No.1279 Array Battle
|
| コンテスト | |
| ユーザー |
madoka
|
| 提出日時 | 2020-11-06 22:03:49 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 11 ms / 2,000 ms |
| コード長 | 7,252 bytes |
| コンパイル時間 | 1,313 ms |
| コンパイル使用メモリ | 169,020 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-22 12:49:39 |
| 合計ジャッジ時間 | 2,008 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
/********include********/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#define popcount __builtin_popcount
using namespace std;
//#include <atcoder/all>
/***/
//#include <iomanip>
//#include <cmath>
#include <bits/stdc++.h>
/********define********/
#define rep(i,x) for(long long i=0;i<x;i++)
#define repn(i,x) for(long long i=1;i<=x;i++)
#define rrep(i,x) for(long long i=x-1;i>=0;i--)
#define rrepn(i,x) for(long long i=x;i>1;i--)
#define REP(i,n,x) for(long long i=n;i<x;i++)
#define REPN(i,n,x) for(long long i=n+1;i<x;i++)
#define pr printf
#define re return
#define mod 1000000007
//#define mod 998244353
#define inf INT_MAX//19桁
#define INF 1e18+5//19桁
const double PI=3.14159265358979323846;
#define fi first
#define se second
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define all(x) (x).begin(),(x).end()
typedef long long int ll;
typedef pair<long long, long long> P;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
/********よく使う********/
/*マップ*/
//map<ll, ll, std::greater<ll>> mp;
/*デキュー*/
//deque<long long> dque;
/*文字列*/
//string s;
//wk=(ll)stoi(s);
//wk=stoll(s);
//t-'a'+'A'//大文字化
//string t;
//t=s.substring(0,1);//0文字目から1つ取り出す
//if(s.size()%2==0 && s.substr(0,s.size()/2)==s.substr((s.size())/2))//引数一つの時はその個所から最後まで
//s.insert(0, " ");
//reverse(s.begin(),s.end());
//s+="-AI";
//s+=char('a'+N%26);
//string t;
//t=s.substr(s.size()-2);
//to_bigger(t);//返り値無し 文字列を大文字化
//cout << s.substr(0,s.size()-2)+t << "\n";
/*セット*/
//set<ll> st;
/*スタック*/
//stack<long long> sta;
/*キュー*/
//queue<long long> que;
/*パミュ*/
//do{
//}while(next_permutation(v.begin(),v.end()));
/*でかい数*/
//__int128 aa = 1;
//lll p=1;
/*エラトステネスの篩*/
//wk=sieve(p);
/******初期化***********/
long long ans,ans1,ans2,ans3,ans4;
long long sum,sum1,sum2,sum3,sum4;
long long cnt,cnt1,cnt2,cnt3,cnt4;
long long flg,flg1,flg2,flg3,flg4;
long long wk,wk1,wk2,wk3,wk4;
long long max,max1,max2,max3,max4;
long long min,min1,min2,min3,min4;
ans=ans1=ans2=ans3=ans4=0;
sum=sum1=sum2=sum3=sum4=0;
cnt=cnt1=cnt2=cnt3=cnt4=0;
flg=flg1=flg2=flg3=flg4=0;
wk=wk1=wk2=wk3=wk4=0;
max=max1=max2=max3=max4=0;
min=min1=min2=min3=min4=INF;
double dwk,dwk1,dwk2,dwk3,dwk4;
double dsum,dsum1,dsum2,dsum3,dsum4;
double dans,dans1,dans2,dans3,dans4;
dwk=dwk1=dwk2=dwk3=dwk4=0;
dsum=dsum1=dsum2=dsum3=dsum4=0;
dans=dans1=dans2=dans3=dans4=0;
/*ベクター*/
//std::sort(v.begin(),v.end());//昇順ソート
//sort(all(v));
//std::sort(v.begin(),v.end(),std::greater<long long>());//降順ソート
//v.erase(unique(v.begin(), v.end()), v.end());
//vector<ll> v(N, 0);
/*ペア*/
//vector<pair<long long, long long> > p(N);
//sort(p.begin(), p.end());
//sort(p.begin(), p.end(),greater<pair<long long,long long> >());
//vector<P>w;
//w.push_back({wk1,wk2});
/*プライオリティキュー*/
//priority_queue<lon long, vector<long long>, greater<long long> > que;
//priority_queue<long long> que;
/*
cin >> N;
vector<ll>v(N);
rep(i,N){
cin >> v[i];
}
*/
/******出力関連***********/
//pr("%lld\n",N);
//printf("%lld",(ll)ceil(dB/dA));
//puts("Yes");
//文字列の出力
//std::cout << s << std::endl;
//printf("%.12f\n",ret);
//cout << sum << '\n';
//pr("%02lld:%02lld",wk/60,wk%60);
/******CF***********/
/*
cin >> T;
while(T--){
cin >> N >> K;
std::vector<long long> v(N);
// 配列入力1
/*
for(long long i=0; i<N; i++){
std::cin >> v[i];
}
*/
//std::sort(v.begin(),v.end(),std::greater<long long>());//降順ソート
//cout << sum << '\n';
//文字列の出力
//std::cout << s << std::endl;
/*ラベル
goto end;
end:
*/
//}
//re 0;
/******よく使う***********/
//素因数分解
//1の場合pfは空 5の場合pfはfi=5,se=1
/*
auto pf = prime_factorize(v[i]);
for(auto p:pf){
if(p.se!=wk){
}
}
*/
//約数列挙
/*
vector<long long> div = calc_divisor(M);
// M の約数 d であって、d * N <= M となる最大の d を求める
long long res = 1;
for (auto d : div) {
if (d * N <= M) res = max(res, d);
}
*/
//最小公倍数
/*
std::vector<ll> v(N);
rep(i, N) {
cin >> v[i];
}
cout << lcm(v) << endl;
return 0;
*/
//最小公約数
/*
std::vector<ll> v(N);
rep(i, N) {
cin >> v[i];
}
cout << gcd(v) << endl;
return 0;
*/
//素数判定
/*
for(int i=x; ; i++){
bool dame=0;
for(int j=2; j*j<=i; j++){
if(i%j==0){
dame=1;
break;
}
}
if(!dame){
cout<<i<<endl;
return 0;
}
}
*/
//set典型
/*
std::set<long long> st;
for(long long i=0; i<N; i++){
std::cin >> v[i];
if(st.find(v[i])==st.end()){
st.insert(v[i]);
}
else{
st.erase(v[i]);
}
}
//set典型2
rep(i,N){
max=MAX(max,v[i]);
min=MIN(min,v[i]);
}
std::set<long long> st;
for(long long i=0; i<N; i++){
if(st.find(v[i])==st.end()){
st.insert(v[i]);
}
else{
//st.erase(v[i]);
}
}
while(max-min!=0){
st.erase(max);
if(st.find(max-min)==st.end()){
st.insert(max-min);
}
max=*st.rbegin();//最小
min=*st.begin();//最大
}
for(auto itr = st.begin(); itr != st.end(); ++itr) {
std::cout << *itr << " "; // イテレータの指す先のデータを表示
}
*/
//map典型
//int minv = mp.begin()->first;//最小
//int maxv = mp.rbegin()->first;//最大
//stack典型
/*
stack<char> sta;
rep(i,s.size()){
if(s[i]=='A'){
sta.push('A');
}
else{
if(sta.empty()){
sta.push('B');
}
else if(sta.top()=='B'){
sta.pop();
}
else{
sta.pop();
}
}
}
cout<<sta.size()<<"\n";
*/
//整数判定
//if(ceil(sqrt(wk)==floor(sqrt(wk))))
//パミュ
ll N;
cin>>N;
vector<ll>v(N);
vector<ll>w(N);
rep(i,N){
cin>>v[i];
}
rep(i,N){
cin>>w[i];
}
map<ll,ll>mp;
rep(i,N){
mp[v[i]]++;
}
wk=1;
ans=1;
for(auto p:mp){
wk=1;
while(p.se!=1){
wk*=p.se;
p.se--;
}
ans*=wk;
}
sort(v.begin(),v.end());
do{
sum=0;
rep(i,N){
sum+=MAX(v[i]-w[i],0);
}
max=MAX(max,sum);
}while(next_permutation(v.begin(),v.end()));
sort(v.begin(),v.end());
sum=0;
do{
sum=0;
rep(i,N){
sum+=MAX(v[i]-w[i],0);
}
if(sum==max)cnt++;
}while(next_permutation(v.begin(),v.end()));
cout<<cnt*ans<<"\n";
//26進数
/*
string s;
while(N>=0){
s+=char('a'+N%26);
N/=26;
N--;
}
reverse(all(s));
*/
//N進数からK進数へ
/*
string s;
s=Itoa(N,K);
pr("%lld",(ll)s.size());
//putchar('\n');
re 0;
*/
/******出力関連***********/
//pr("%lld\n",N);
//printf("%lld",(ll)ceil(dB/dA));
//puts("Yes");
//文字列の出力
//std::cout << s << std::endl;
//printf("%.12f\n",ret);
//cout << sum << '\n';
//pr("%02lld:%02lld",wk/60,wk%60);
re 0;
}
madoka