squee_spoon的补题栈

来源:互联网 发布:网络应急指挥体系 编辑:程序博客网 时间:2024/06/05 05:37

太弱了,栈无法人脑维护了。。。


姿势:

莫比乌斯反演

fft

中国剩余定理

主席树  cdq分治。。



zoj 3837 挖矿,大概是搜索

#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<string.h>#include<cstdio>using namespace std;#define ll long long#define INF 1000000000char mp[11][11];bool vis[11][11];int id[11][11];int N;int k;bool mat[88][88];//邻接矩阵int deg[88];//点的度 int w[88];vector<int> hasmine;bool hm[88];int ans;int cnt[88];int dis[88][88];void init(){memset(vis,0,sizeof(vis));memset(id,0,sizeof(id));memset(mat,0,sizeof(mat));memset(cnt,0,sizeof(cnt));memset(w,0,sizeof(w));hasmine.clear();k=0;ans=0;}void calc_dis(){//用于启发函数for(int i=1;i<=k;i++){for(int j=1;j<=k;j++){if(mat[i][j])dis[i][j]=w[j];else dis[i][j]=INF;}}for(int kk=1;kk<=k;kk++){for(int i=1;i<=k;i++){for(int j=1;j<=k;j++){if(i==j)continue;dis[i][j]=min(dis[i][j],dis[i][kk]+dis[kk][j]);}}}}int h(){int val=0;for(int i=0;i<hasmine.size();i++){int MIN=INF;for(int x=1;x<=k;x++){if(!cnt[x])continue;//if(x==hasmine[i])continue;if(cnt[hasmine[i]])MIN=0;MIN=min(MIN,dis[x][hasmine[i]]);}val=max(val,MIN);}return val;}void dfs(int n,int m){vis[n][m]=1;id[n][m]=k;if(mp[n][m]=='@')hasmine.push_back(k);if(n>1&&!vis[n-1][m]){if(mp[n-1][m]=='0'||mp[n-1][m]=='@'||mp[n-1][m]=='v'){dfs(n-1,m);}}if(m>1&&!vis[n][m-1]){if(mp[n][m-1]=='0'||mp[n][m-1]=='@'||mp[n][m-1]=='v'){dfs(n,m-1);}}if(n<N&&!vis[n+1][m]){if(mp[n+1][m]=='0'||mp[n+1][m]=='@'||mp[n+1][m]=='v'){dfs(n+1,m);}}if(m<N&&!vis[n][m+1]){if(mp[n][m+1]=='0'||mp[n][m+1]=='@'||mp[n][m+1]=='v'){dfs(n,m+1);}}}void solve(int cur,int cost,int pre){//cout<<"dfsing"<<cur<<" cost="<<cost<<endl;bool ok=1;for(int i=0;i<hasmine.size();i++){if(!cnt[hasmine[i]])ok=0;}if(ok){ans=min(ans,cost);return;}if(cost+h()>=ans){return;}for(int i=1;i<=k;i++){if(!mat[cur][i])continue;if(cnt[i]>=deg[i])continue;if(!hm[cur]&&i==pre)continue;if(!cnt[i])cost+=w[i];cnt[i]++;solve(i,cost,cur);cnt[i]--;if(!cnt[i])cost-=w[i];}}int main(){int t;cin>>t;while(t--){init();scanf("%d",&N);for(int i=1;i<=N;i++){scanf("%s",mp[i]+1);}for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){if(mp[i][j]=='X'){continue;}else if(!vis[i][j]){if(mp[i][j]=='0'||mp[i][j]=='@'||mp[i][j]=='v'){k++;dfs(i,j);if(mp[i][j]=='@'){hasmine.push_back(k);}}else{id[i][j]=++k;w[k]=mp[i][j]-'0';}}}}unique(hasmine.begin(),hasmine.end());memset(hm,0,sizeof(hm));for(int i=0;i<hasmine.size();i++){hm[hasmine[i]]=1;}for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){mat[id[i][j]][id[i+1][j]]=1;mat[id[i][j]][id[i-1][j]]=1;mat[id[i][j]][id[i][j+1]]=1;mat[id[i][j]][id[i][j-1]]=1;}}for(int i=1;i<=k;i++){int dd=0;for(int j=1;j<=k;j++){if(mat[i][j])dd++;}deg[i]=dd;}calc_dis();/*for(int i=1;i<=k;i++){cout<<deg[i];cout<<endl;}for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){cout<<id[i][j];}cout<<endl;}*/int start=id[N/2+1][N/2+1];cnt[start]=1;if(h()==INF){cout<<"-1"<<endl;continue;}for(int i=0;i<hasmine.size();i++){ans+=dis[start][hasmine[i]];}solve(start,0,0);cout<<ans<<endl;}return 0;}




hdu 5033 

Building


#include<iostream>#include<cmath>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<string.h>#include<cstdio>using namespace std;#define maxn 100010#define M_PI 3.14159265358979323846pair<double,double> p[maxn];int q[maxn];double ans[maxn];int rnk[maxn];int sta[maxn];inline bool cmp(int a,int b){return q[a]<q[b];}inline double calc(double x1,double x2,double h){return h/abs(x1-x2);}int main(){//freopen("in.txt","r",stdin);//freopen("myout.txt","w",stdout);int t;cin>>t;for(int cas=1;cas<=t;cas++){int n,Q;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lf",&p[i].first);scanf("%lf",&p[i].second);}sort(p+1,p+n+1);scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d",&q[i]);rnk[i]=i;}sort(rnk+1,rnk+Q+1,cmp);int k=2;int top=0;sta[top++]=1;for(int i=1;i<=Q;i++){while(p[k].first<q[rnk[i]]){if(p[k].second>=p[sta[top-1]].second){top--;sta[top++]=k;}else{if(top>1){double lastk=calc(p[sta[top-2]].first,p[sta[top-1]].first,p[sta[top-2]].second-p[sta[top-1]].second);double curk=calc(p[sta[top-1]].first,p[k].first,p[sta[top-1]].second-p[k].second);if(curk<lastk){//poptop--;sta[top++]=k;}else{sta[top++]=k;}}}k++;}double tmp=0;for(int j=0;j<top;j++){tmp=max(tmp,calc(p[sta[j]].first,q[rnk[i]],p[sta[j]].second) );}ans[rnk[i]]=180/M_PI*atan(tmp);}k=n-1;top=0;sta[top++]=n;for(int i=Q;i>=1;i--){while(p[k].first>q[rnk[i]]){if(p[k].second>=p[sta[top-1]].second){top--;sta[top++]=k;}else{if(top>1){double lastk=calc(p[sta[top-2]].first,p[sta[top-1]].first,p[sta[top-2]].second-p[sta[top-1]].second);double curk=calc(p[sta[top-1]].first,p[k].first,p[sta[top-1]].second-p[k].second);if(curk<lastk){//poptop--;sta[top++]=k;}else{sta[top++]=k;}}}k--;}double tmp=0;for(int j=0;j<top;j++){tmp=max(tmp,calc(p[sta[j]].first,q[rnk[i]],p[sta[j]].second) );}ans[rnk[i]]+=180/M_PI*atan(tmp);}printf("Case #%d:\n",cas);for(int i=1;i<=Q;i++){printf("%.10lf\n",180-ans[i]);}}return 0;}


0 0