9.29 考試
阿新 • • 發佈:2017-09-30
struct hide 啊啊啊 pri printf std val 我只 ons
題做得有點懵B,過來寫個題解吧...
T1
我只能說思(ji)路(qi)奇(gou)妙(shi)
強制在線就是tmd個幌子
其實是根據las=0 OR 質數,然後反解出opt(神神神%%%)
除了最後一個操作是 詢問需要暴力sort外,其他都是推出來的
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #define mem(a,b) memset(a,b,sizeof(a)) #defineT1ll long long using namespace std; const int N=200006; const int MAXVAL=1000006; int prime[MAXVAL],cnt; bool he[MAXVAL]; void get_prime() { for(int i=2;i<MAXVAL;++i) { if(!he[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&prime[j]*i<MAXVAL;++j) { he[prime[j]*i]=1; if(i%prime[j]==0) break; } } } struct son { int op,l,r; }ji[N]; int an[N],kk[N]; int n,m,K; int v[N]; void work() { int order=m,flag=0; if(kk[m]==1) { flag=1; --order; } for(int i=order;i>=1;--i) if(kk[i]==1) an[i]=kk[i+1]^ji[i+1].op; if(flag) { int tin1,tin2,las=0; for(int i=1;i<m;++i) { if( kk[i]==2 ) { tin1=ji[i].l^las; tin2=ji[i].r^las; v[tin1]=tin2; } else las=an[i]; } tin1=las^ji[m].l; tin2=las^ji[m].r; sort(v+tin1,v+tin2+1); int con=0; for(int i=tin1;i<=tin2;++i) if(!he[v[i]]) { ++con; if(con==K) { an[m]=v[i]; break; } } } for(int i=1;i<=m;++i) if(kk[i]==1) printf("%d\n",an[i]); } int main(){ get_prime(); scanf("%d%d%d",&n,&K,&m); for(int i=1;i<=n;++i) scanf("%d",&v[i]); for(int i=1;i<=m;++i) scanf("%d%d%d",&ji[i].op,&ji[i].l,&ji[i].r); int las=0; for(int i=1;i<=m;++i) { if( (las^ji[i].op)&1 ) { kk[i]=1; las=1; } else kk[i]=2; } work(); }
T2
n^3暴力好打
30分,開O3 40分...
正解就是枚舉左(或上)邊界,算出右邊界在最右面的ans,然後再掃右邊界,一個一個的去(用鏈表維護...)
#include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> #include <vector> #include <algorithm> #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=3106; int tx[N],ty[N],id[N]; int dui[N]; int con; int R,C,n,K; int jix[N],jiy[N]; ll ans,sum; int pre[N],nxt[N]; ll v[N]; bool ok(int x,int y) { /*if(tx[id[x]]==tx[id[y]]) return ty[id[x]]<ty[id[y]]; return tx[id[x]]<tx[id[y]];*/ if(tx[x]==tx[y]) return ty[x]<ty[y]; return tx[x]<tx[y]; } vector<int> q[N]; void del(int x) { nxt[pre[x]]=nxt[x]; pre[nxt[x]]=pre[x]; sum-=v[x]; int t1=nxt[x],t2=nxt[x]; for(int i=1;i<K;++i) t2=nxt[t2]; for(int i=1;i<=K;++i) { sum-=v[t1]; v[t1]=(tx[t1]-tx[pre[t1]])*(R-tx[t2]+1); sum+=v[t1]; t1=pre[t1];t2=pre[t2]; } } void work() { ll temp; int nx; for(int j=1;j<=C;++j) { sum=0;con=0;mem(v,0); for(int i=1;i<=10;++i) { tx[++con]=0; ty[con]=0; tx[++con]=R+1; ty[con]=0; } for(int i=1;i<=n;++i) if(jiy[i]>=j) { tx[++con]=jix[i]; ty[con]=jiy[i]; dui[i]=con; } for(int i=1;i<=con;++i)id[i]=i; sort(id+1,id+1+con,ok); for(int i=1;i<=con;++i) pre[id[i]]=id[i-1],nxt[id[i]]=id[i+1]; pre[id[1]]=id[1];nxt[id[con]]=id[con]; //printf("con=%d\n",con); /*for(int qw=id[1],i=1;i<=con;++i,qw=nxt[qw]) printf("%d %d\n",tx[qw],ty[qw]); printf("\n");*/ for(int i=1;i<=con;++i) { nx=i; for(int k=1;k<K;++k) nx=nxt[nx]; //printf("%d %d %d %d\n",tx[id[i]],ty[id[i]],tx[nx],ty[nx]); v[i]=(tx[i]-tx[pre[i]])*(R-tx[nx]+1); sum+=v[i]; //printf("sum=%lld\n",sum); } //printf("sum=%lld\n",sum); for(int k=C;k>=j;--k) { //printf("k=%d sum=%lld\n",k,sum); ans+=sum; temp=q[k].size(); for(int p=0;p<temp;++p) del(dui[q[k][p]]); } //printf("j=%d ans=%lld\n",j,ans); } } int main(){ //freopen("in.in","r",stdin); //freopen("T2.in","r",stdin); //freopen("T22.out","w",stdout); scanf("%d%d%d%d",&R,&C,&n,&K); for(int i=1;i<=n;++i) { scanf("%d%d",&jix[i],&jiy[i]); q[jiy[i]].push_back(i); } work(); cout<<ans; }T2
總之 這次題及其 啊啊啊啊,然後就覺得自己弱的 ...
9.29 考試