SDOI2016Round1 解題報告

2022-04-21 10:29:08 字數 4073 閱讀 5554

題意:求∑n?1i=0∑m?1j=0max((ixorj)?k,0)

因為是抑或操作,每一位都是獨立的,所以可以一位一位的算貢獻。

f[i][a][b][c]表示第i位時,每個數跟n,m,k的大小關係,0表示小於,1表示i位之前都相等,2表示大於。轉移的時候美劇當前這一位的數是什麼,從高位向低位轉移就行了。

複雜度是o(nlogn)

code:

#include

#include

#include

#include

using namespace std;

#define ll long long

const int n=100;

int t,mod,ni[n],mi[n],ki[n],len;

ll n,m,k,f[n][2][2][3],g[n][2][2][3];

inline void calc()

calc();

printf("%lld\n",(f[len][0][0][2]-(k%mod*g[len][0][0][2])%mod+mod)%mod);

}}題意:給出n種數字,第i個是ai,個數是bi,權值是ci。如果ai|aj而且aiaj是乙個質數,那麼這兩個數字就能獲得ci?cj的價值,要求總價值不小於0的情況下求最多的配對數。

配對關係是乙個二分圖,所以建出費用流的圖來,當跑到費用小於0的時候,處理一下當前的流量,退出就行了。

code:

#include

#include

#include

#include

using namespace std;

#define t n+2

#define d 795

#define ll long long

#define inf 1000000000

#define inf 10000000000000ll

const int n=800;

const int m=100000;

const int o=2000000;

bool flag[m+10],use[n],f[n];

struct saa[o];

int n,a[n],b[n],c[n],prime[m+10],d[n],va,point[n],pre[n],next[o],map[n][n],tot=1,co[n];

int l[n],to[n];

ll dis[n];

inline void prepare()

}}inline void add(int x,int y,int z,ll co)

inline bool check(int x,int y)

if(now!=1) ++num;

return num==1;

}inline void paint(int x,int kind)

inline ll spfa(int x,int y)aa[n<<1];

struct ttr[n<<2];

int n,m,point[n],next[n<<1],tot,deep[n],siz[n],son[n],belong[n],fa[n][21],q[n],pos[n],dfsn,cur[n],lca,to[n],flag[n<<2];

inline int in()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}inline int in()

while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}inline void add(int x,int y,int z)

inline void prepare()

h+=1;

}for(i=t;i;--i)

}int now=1;

for(i=1;i<=n;++i) cur[i]=point[i];

while(now)

else

}}inline int lca(int x,int y)

int o1=calc(l,now.lca,now.st,now.kind)*now.k+now.bmid) insert(r,x,y,now);

tr[k].minn=min(tr[k].minn,min(tr[k<<1].minn,tr[k<<1|1].minn));

}inline ll query(int k,int l,int r,int x,int y)

minn=min(minn,calc(max(x,l),tr[k].lca,tr[k].st,tr[k].kind)*tr[k].k+tr[k].b);

minn=min(minn,calc(min(y,r),tr[k].lca,tr[k].st,tr[k].kind)*tr[k].k+tr[k].b);

if(x<=mid) minn=min(minn,query(l,x,y));

if(y>mid) minn=min(minn,query(r,x,y));

return minn;

}inline void change(int x,int y,int st,int kind);

while(belong[x]!=belong[y])

insert(1,1,n,pos[y],pos[x],now);

}inline ll ask(int x,int y)

minn=min(minn,query(1,1,n,pos[y],pos[x]));

return minn;

}int main()tr[n<<2];

int n,a[n],b[n],m,t1[n],t2[n],sa[n],rank[n],c[n],height[n],st[n][21],log[n];

inline int in()

inline bool cmp(int *y,int p,int q,int k)

inline void build_sa()

}inline void build_height()

int main()

inline ll quickpow(ll x,ll y)

return ans;

}int main()

ll ans=f[n-m]*((g[n]*quickpow(g[m],mod-2)%mod)*quickpow(g[n-m],mod-2)%mod)%mod;

printf("%lld\n",ans);

}}題意:有乙個長度為n的序列,每個節點都有乙個權值,分成m份,求m份的最小的方差是多少。答案要求?m2。

ans=m?∑mi=1(xi?xˉ)2

=m?∑mi?1(xi2+xˉ2?2xi?xˉ)

把∑拆開之後,後面兩項都是常數,就相當於求每段的平方和的最大。這個東西可以斜率優化。

code:

#include

#include

#include

using namespace std;

#define ll long long

const int n=3010;

ll f[n][n],a[n];

int n,m,h[n],t[n],q[n][n];

inline ll pow(ll x)

inline ll get_son(int x,int y,int z)

inline ll get_fa(int x,int y)

inline ll calc(int x,int y,int z)

int main(){

int i,j;

scanf("%d%d",&n,&m);

for(i=1;i<=n;++i)

scanf("%lld",&a[i]),a[i]+=a[i-1];

memset(f,127/3,sizeof(f));

for(j=0;j<=m;++j) f[j][0]=0,q[j][h[j]=t[j]=1]=0;

for(j=1;j<=m;++j)

for(i=1;i<=n;++i){

while(h[j-1]

P4070 SDOI2016 生成魔咒 解題報告

link 一開始給乙個空串 s ss,每次在其最後加入乙個字元 x xx,詢問每次加入後 s ss 的本質不同的非空子串的個數。s 105 1 x 109 s le 10 5,1 le x le 10 9.s 10 5,1 x 10 9.具體地說,加入乙個字元 x xx 得到的貢獻就為 len np...

20161023 NOIP 模擬賽 T1 解題報告

task 1.紙盒子 box.pas box.c box.cpp 題目描述 mcx是乙個有輕度潔癖的小朋友。有一天,當他沉溺於數學卷子難以自拔的時候,恍惚間想起在自己當初學習概率的時候準備的一堆橡皮還雜亂地堆在自習室裡。這顯然是他無法容忍的。於是他決定做乙個體積為v v abc 的紙盒子,以便能整齊...

20161007 NOIP 模擬賽 T1 解題報告

排序 3.1 題意描述 眾所周知,熟練掌握至少一種排序演算法是參加noip的必備技能。常見的排序演算法有冒泡 排序 歸併排序 快速排序 奇偶排序 猴子排序 梳排序 雞尾酒排序 臭皮匠排序等。在這裡,介紹一種利用棧進行排序的方法。例如,當陣列中的元素為 1,3,2 時,我們可 以利用棧對其進行排序 1...