10 2013 档案
摘要:#include#include#include#include#include#define Maxn 100using namespace std;int dp[1<<21],num[Maxn],bag[Maxn][Maxn],g,b,s,now[22];bool vi[Maxn];int dfs(int S,int now[]){ if(vi[S]) return dp[S]; if(S==0) return 0; int a[22],c[22]; int i,j,f; int ans=-10000000; int num=0; vi[S]=1;...
阅读全文
摘要:思路:树状数组统计。待验证,不知道是否对。#include#include#include#include#include#define lowbit(x) (x&(-x))#define Maxn 200010using namespace std;int C[Maxn],vi[Maxn],pre[Maxn],n,num[Maxn],ans[Maxn],ov[Maxn];struct Qu{ int l,r,i;}q[Maxn];int cmp(Qu a,Qu b){ return a.r<b.r;}void update(int pos,int val){ while(p..
阅读全文
摘要:思路:已知当前的总长度和为len,当前的伤害为sum,伤害次数为 num.那么对下一个点的伤害值sum=sum+2*len+num;这个是通过(x+1)^2展开化简就能得到。#include#include#include#include#include#define Maxn 100010#define LL __int64#define inf 1e12using namespace std;LL num[Maxn],cnt[Maxn],n,k;bool OK(LL x){ LL suma,sumb,ans,po,i,numa; LL j=n; suma=sumb=an...
阅读全文
摘要:思路:直接通过斜率优化进行求解。#include#include#include#include#include#define Maxn 1000010using namespace std;__int64 sum[Maxn];__int64 num[Maxn];int que[Maxn*4];int main(){ int n,k,head,rear,x; int i,j; double ans; while(scanf("%d%d",&n,&k)!=EOF){ ans=0; for(i=1;i=(sum[i]-sum[que[head]]...
阅读全文
摘要:思路:很普通的斜率dp#include#include#include#include#define Maxn 10010#define LL intusing namespace std;LL dp[Maxn][2],num[Maxn];int que[Maxn*10];inline LL getleft(int x,int j,int k){ return dp[j][x]+num[j+1]*num[j+1]-(dp[k][x]+num[k+1]*num[k+1]);}inline LL getright(int j,int k){ return 2*(num[j+1]-num...
阅读全文
摘要:思路:dp[i]=dp[j]+(sum[i]-sum[j])^2+m;剩下的就是普通斜率dp做法。#include#include#include#include#include#define Maxn 500010#define LL __int64using namespace std;LL dp[Maxn],num[Maxn],sum[Maxn];int que[Maxn*2];LL getleft(int j,int k){ return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);}LL getright(int j,int k){ ...
阅读全文
摘要:思路:dp[i][x]=dp[j][x-1]+val[i]-val[j]-sum[j]*sum[i]+sum[j]*sum[j];其中val[i]表示1~~i是一段的权值。然后就是普通斜率dp做法。#include#include#include#include#include#define Maxn 1010#define LL __int64using namespace std;LL dp[Maxn][Maxn],num[Maxn],sum[Maxn],val[Maxn];int que[Maxn*10];LL getleft(int x,int j,int k){ return ...
阅读全文
摘要:思路:dp[i]=dp[j]+sum[i]-sum[j]-(i-j)*num[j+1];然后就是比较斜率。注意的时这里j+t#include#include#include#include#define Maxn 400010#define LL __int64using namespace std;LL num[Maxn],sum[Maxn],dp[Maxn];int que[Maxn*10];LL Getleft(int j,int k){ return dp[j]-sum[j]+j*num[j+1]-(dp[k]-sum[k]+k*num[k+1]);}LL Getright(in...
阅读全文
摘要:思路:将每个关系当成一条有向边,查询时就判断之间存在路径。#include#include#include#include#include#include#define Maxn 210using namespace std;map g;map ver;int head[Maxn*2],vi[Maxn*2],e;struct Edge{ int u,v,next;}edge[Maxn*Maxn*2];void add(int u,int v){ edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;}bool dfs(in...
阅读全文
摘要:思路:直接vector暴力#include#include#include#include#define Maxn 2000010using namespace std;vector g;char str[Maxn],ss[20];int main(){ int t,i,j,l,pos,ll,r; scanf("%d",&t); while(t--){ g.clear(); scanf("%s",str); l=strlen(str); for(i=0;i<l;i++) g.push_back(st...
阅读全文
摘要:思路:枚举每个位置的最小字符,用最大匹配判断是否可行#include#include#include#include#include#define Maxn 1010using namespace std;int match[Maxn],vi[Maxn],num[Maxn],g[Maxn][Maxn],f[Maxn],ch[Maxn],n,le;void init(){ memset(match,-1,sizeof(match)); memset(vi,0,sizeof(vi)); memset(num,0,sizeof(num)); memset(g,0,sizeof...
阅读全文
摘要:思路:dp[i][j][x]表示状态 i 以 j 为结束 得分为 x 的方案数。#include#include#include#include#includeusing namespace std;int dp[5000][13][40],g[5][5],d[13][13],n,l,ans;bool vi[13],ntou[13];struct Point{ int x,y;}p[13];bool OK(int a,int b){ int x1,y1,x2,y2,i; x1=p[a].x,y1=p[a].y; x2=p[b].x,y2=p[b].y; if(x1...
阅读全文
摘要:思路:和求区间内有多少个不同的数一样,只不过改下权值。#include#include#include#include#include#define Maxn 50010#define LL __int64#define lowbit(x) (x&(-x))using namespace std;int pre[1000010],num[Maxn],n;LL ans[Maxn*4],C[Maxn];struct Query{ int i,l,r; int operatorm) break; } /* for(i=1;i<=n;i++) ...
阅读全文
摘要:思路:枚举+树的直径#include#include#include#include#include#define clr(x,y) memset(x,y,sizeof(x))#define Maxn 3000#define inf 100000000using namespace std;int head[Maxn],Max[Maxn],lMax[Maxn],id[Maxn],road[Maxn],e,n,ans,te;bool vi[Maxn];struct Edge{ int u,v,next,val;}edge[Maxn*2];void init(){ clr(head,-...
阅读全文
摘要:思路:dp[i]=dp[j]+(num[i]-num[j+1])^2;#include#include#include#include#define Maxn 1000010#define LL unsigned __int64using namespace std;LL dp[Maxn],num[Maxn];int que[Maxn*3];inline int ReadInt(){ char ch = getchar(); int data = 0; while (ch '9') ch = getchar(); do { ...
阅读全文
摘要:A 水题。B 计算几何求重心,枚举对称点。#include #include #include #include #include using namespace std;#define maxn 600#define eps 1e-6bool zero(double a) {return (fabs(a)eps){ t=barycenter(p[0],p[i],p[i+1]); ret.x+=t.x*t2; ret.y+=t.y*t2; t1+=t2; } } if(fabs(t...
阅读全文
摘要:思路:先O(n)预处理出ri[i][j],le[i][j],分别表示第i个位置向右边移动出j个空格需要的步数,表示第i个位置向左边移动出j个空格需要的步数。然后枚举间隙处,二分判段最大间隔。#include#include#include#include#define Maxn 710#define inf 100000000using namespace std;int ri[Maxn][Maxn],le[Maxn][Maxn],n,m;char str[Maxn];bool OK(int pos,int x){ int i,j,cnt=inf; if(pos==1) { ...
阅读全文
摘要:思路:见代码#include#include#include#include#define Maxn 110using namespace std;int a[Maxn][Maxn],b[Maxn][Maxn],n,k;bool equel(){ int i,j; for(i=1;i1) return false; return true;}bool bb(){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(b[i][j]!=b[j][i]) r...
阅读全文
摘要:思路:这题的原型题是比较经典的网络流。原型题模型就是把所有的障碍去掉。有障碍做法还是一样的,只用将每个列和行重新划分,求最大流就行了。#include #include #include #include #define Maxn 120010#define Maxm 210000#define LL int#define inf 100000000#define Abs(a) (a)>0?(a):(-a)using namespace std;struct Edge{ int from,to,next; LL val;}edge[Maxm];const double eps=1e...
阅读全文
摘要:思路:这题的N有500,直接floyd肯定超时。我的做法是每次枚举一个点,求出包含这个点的最小环。对所有最小环取最小值。求包含某个点的最小环我用的是启发式搜索,先以该点求一次spfa,然后dfs解决问题。#include#include#include#include#define Maxn 600#define inf 1000000using namespace std;int head[Maxn],vi[Maxn],dis[Maxn],e,que[Maxn*100],ans,dist[Maxn];struct Edge{ int u,v,next;}edge[Maxn*100];v...
阅读全文

浙公网安备 33010602011771号