918……
预审:
T1
枚举子集???3^N
T2
16MB……像数学题……A是开不下的……
总之T2是只能开个M的数组
T3
反复亦或的话……没想法
过程:
T1
先$mod$一下$n$
然后排个序?
有$0$直接出,要不两头扫
仿佛对
先考虑更靠近$0,N$的
用另一个去填。
仿佛出锅了……
目前仿佛是:
在有序的数组里前缀和可以得出正确的ans
目前来看,仿佛无解还真做不到……
无论如何都有解?
于是又无聊写了单调栈……
证明:
前缀和在mod n 意义下有n种情况
1. 有 0,直接输出
2. 无 0,则还剩n-1 种情况,由抽屉原理可知必有至少两个相等.
于是一定有一个合法区间。
故此题一定有解。
(于是也可以 O(N) 过了)
马上改桶,单调栈爆了……
又快又好QwQ
关于对拍:
写个××暴力,写spj就可以了啊=。=
附一个用 fstream 和 mt19937 写的,要开C++11编译……
#include <bits/stdc++.h>
#define N 100000
#define M 1111111
using namespace std;
int arr[M],nn,an;
bool che[M];
mt19937 rr(time(0));
bool check(){
fstream dat;
dat.open("1.in",ios_base::in);
dat>>nn;
for(int i=1;i<=nn;i++){
dat>>arr[i];
}
dat.close();
fstream ans;
ans.open("1.out",ios_base::in);
ans>>an;
if(an==-1){
cout<<"-1-1-1-1-1-1-1-1-1-1-"<<endl;
exit(0);
}
int ansc=0,b;
memset(che,0,sizeof che);
for(int i=1;i<=an;i++){
ans>>b;
if(che[b]==1)return 0;
ansc+=arr[b];
che[b]=1;
ansc%=nn;
}
return ansc==0;
}
void Ran(){
fstream ran;
ran.open("1.in",ios_base::out);
int n=10000;
ran<<n<<endl;
for(int i=1;i<=n;i++)
ran<<int(rr()%1000000000+1)<<" ";
ran.close();
}
int main(){
int T=N;
while(T--){
Ran();
system("time ./T");
if(!check()){
puts("WA----------------QnQ");
return 0;
}
cout<<T<<"/"<<N;puts("AcA QvQ");
}
}
/*
g++ dp.cxx -o dp
g++ T1.cpp -o T
ls
./dp
*/
T2
$A[i]=X[i]*pow(Y[i],count[i])+Z[i]+Y[i]*Z[i]+...+pow(Y[i],count[i]-1)*Z[i] \mod {2^{K-1}}$
后面就可以提一个$Z[i]$,然后用$(1-Y[i]^n)*1/1-Y[i] \text{ }or \text{ } nY[i]$求……
做到了$\log$求$A$?
维护$count$前缀和?
一波乱搞,
发现前两个$subtask$可以开出来$A$
hiahiahia
然后一波容斥判断。
T3
只会暴力,10%
结果:
14
| Miemeng | 100
03:13:30
| 0
03:17:12
| 10
03:13:43
| 110
03:17:12
|