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] ext{ }or ext{ } 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
|