部分题解是指没写那道算几。

BZOJ上目前没有day2的题面D2T2的图。

BZOJ4813 小Q的棋盘

显然可以$O(n^2)$DP,然而可以$O(n)$贪心:只有一条从根出发的一条链上的边可以只经过一次,其他边如果被经过则必须经过两次,且次数没用完时一定可以用来经过没被经过的边,那么只用枚举那条链的端点。

感觉和SCOI D1T1神似:$O(n^2)$树形DP显然,然而可以$O(n)$贪心。只不过SCOI DP过不了

#include<stdio.h>
struct node;
typedef struct node edge;
struct node{
int v;
edge*s;
}e[198];
edge*l=e,*h[100];
void ins(int u,int v){
edge s={v,h[u]};
*(h[u]=l++)=s;
}
int n,m,u,v,a,d[100];
void dfs(int u,int j){
if(m>=d[u]){
if(a<d[u]+m+2>>1)
a=d[u]+m+2>>1;
for(edge*i=h[u];i;i=i->s)
if(i->v!=j)
d[i->v]=d[u]+1,dfs(i->v,u);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<n;++i)
scanf("%d%d",&u,&v),ins(u,v),ins(v,u);
dfs(0,0);
printf("%d\n",a<n?a:n);
}

BZOJ4815 小Q的表格

设$\gcd(a,b)=d$,则$f(a,b)=\frac{ab}{d^2}f(d,d)$。

\begin{align*}&\sum_{d=1}^nf(d,d)\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{j=1}^{\left\lfloor\frac nd\right\rfloor}ij[(i,j)=1]\\=&\sum_{d=1}^nf(d,d)\sum_{i=1}^{\left\lfloor\frac nd\right\rfloor}i^2\varphi(i)\end{align*}

分块维护一下$f(d,d)$就好了,复杂度$O(n+m\sqrt{n})$。

#include<cstdio>
#include<cmath>
typedef unsigned long long ll;
const int p=1e9+7;
const int N=4e6+5;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
inline int foo(int x){
return x<p?x:x-p;
}
inline int bar(int x){
return x<0?x+p:x;
}
inline void inc(int&x,int y){
x=foo(x+y);
}
typedef int arr[N];
int m,n,nb,bs,np;
arr b,c1,c2,c3,c4,f,q;
inline int ask(int x){
return x>bs?foo(c3[x]+c4[b[x]]):c3[x];
}
void cov(int x,int y){
int d=bar(y-bar(ask(x)-ask(x-1)));
for(int i=x;i<=c2[b[x]];++i)
inc(c3[i],d);
for(int i=b[x]+1;i<=nb-1;++i)
inc(c4[i],d);
}
int main(){
scanf("%d%d",&m,&n);
bs=sqrt(n+.5)*3/2;
for(int i=1;i<=n;++i)
b[i]=(i-1)/bs;
nb=b[n]+1;
for(int i=1;i<=n;++i)
c2[b[i]]=i;
for(int i=n;i>=1;--i)
c1[b[i]]=i;
for(int i=1;i<=n;++i){
c3[i]=(ll)i*i%p;
inc(c4[b[i]+1],c3[i]);
if(i!=c1[b[i]])
inc(c3[i],c3[i-1]);
}
for(int i=1;i<nb;++i)
inc(c4[i],c4[i-1]);
f[1]=1;
for(int i=2;i<=n;++i){
if(!f[i]){
f[i]=(ll)i*i%p*(i-1)%p;
q[np++]=i;
}
for(int*j=q;;++j){
if(i**j>n)break;
if(i%*j==0){
f[i**j]=(ll)*j**j**j%p*f[i]%p;
break;
}
f[i**j]=(ll)f[i]*f[*j]%p;
}
}
for(int i=2;i<=n;++i)
inc(f[i],f[i-1]);
while(m--){
int x,y;
ll z;
scanf("%d%d%lld%d",&x,&y,&z,&n);
int d=gcd(x,y);
cov(d,z/(x/d)/(y/d)%p);
int i=1,s=0;
while(i<=n){
int j=n/(n/i);
s=(s+(ll)bar(f[j]-f[i-1])*ask(n/i))%p;
i=j+1;
}
printf("%d\n",s);
}
}

BZOJ4822 老C的任务

签到题。

和SCOI D2T1神似:NOIP难度以下签到题。只不过SCOI有人被卡常数T了5分

#include<bits/stdc++.h>
#define lb lower_bound
#define ub upper_bound
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e5+5;
struct node{
node*i,*j;
ll s;
}e[N*20];
node*l=e,*r[N];
void ins(int z,int y,node**o){
for(int i=16;~i;--i){
*++l=**o,*o=l;
if(y>>i&1)o=&(*o)->j;
else
(*o)->s+=z,o=&(*o)->i;
}
}
ll ask(int y,node*s,node*t){
ll z=0;
for(int i=16;~i;--i)
if(~y>>i&1)s=s->i,t=t->i;
else
z+=t->s-s->s,s=s->j,t=t->j;
return z;
}
int n,m,s,t,u,v,x[N],y[N],z[N],a[N],b[N];
vector<int>c[N];
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%d%d%d",x+i,y+i,z+i),a[i]=x[i],b[i]=y[i];
sort(a,a+n);
sort(b,b+n);
for(int i=0;i<n;++i)
c[lb(a,a+n,x[i])-a+1].pb(i),y[i]=lb(b,b+n,y[i])-b+1;
*(*r=e)=(node){e,e};
for(int i=1;i<=n;++i){
r[i]=r[i-1];
for(int j=0;j<c[i].size();++j){
int k=c[i][j];
ins(z[k],y[k],r+i);
}
}
while(m--){
scanf("%d%d%d%d",&s,&t,&u,&v);
s=lb(a,a+n,s)-a+1;
t=lb(b,b+n,t)-b+1;
u=ub(a,a+n,u)-a;
v=ub(b,b+n,v)-b;
printf("%lld\n",ask(v+1,r[s-1],r[u])-ask(t,r[s-1],r[u]));
}
}

BZOJ4823 老C的方块

设特殊边两边的方块为灰色,这两个方块的其他相邻方块分别为黑色和白色,可以将整个棋盘染色。当两个灰色方块同时存在时,相邻的其他方块只能有一种颜色,那么容易建立最小割模型,S向所有黑色方块连边,所有白色方块向T连边,容量为权值;灰色方块与相邻的黑色或白色方块连边,容量为无穷大;两个灰色方块之间连边,容量为两个方块权值的较小值。

#include<bits/stdc++.h>
using namespace std;
const int dx[]={-1,1,0,0};
const int dy[]={0,0,-1,1};
const int N=1e5+5;
const int inf=1061109567;
struct edge{
int v,c;
edge*s;
}e[N*8];
edge*l=e,*h1[N],*h2[N];
void ins(int u,int v,int c){
edge a={v,c,h1[u]};
edge b={u,0,h1[v]};
*(h1[u]=l++)=a;
*(h1[v]=l++)=b;
}
int s1,s2,d[N],q[N];
int dfs(int u,int c){
if(u==s2)return c;
int f=0;
for(edge*&i=h2[u];i;i=i->s)
if(d[u]+1==d[i->v]&&i->c){
int v=dfs(i->v,min(c-f,i->c));
i->c-=v;
e[i-e^1].c+=v;
f+=v;
if(f==c)break;
}
if(!f)d[u]=-1;
return f;
}
int bfs(){
int f=0;
for(;;f+=dfs(s1,inf)){
fill(d,d+s2+1,-1);
d[q[0]=s1]=0;
for(int a=0,b=0;a<=b;++a){
int u=q[a];
for(edge*i=h2[u]=h1[u];i;i=i->s)
if(!~d[i->v]&&i->c)
d[q[++b]=i->v]=d[u]+1;
}
if(!~d[s2])return f;
}
}
int jud(int x,int y){
int a=x&1,b=y&3;
return a&&!b||!a&&b==1?0:a&&b==3||!a&&b==2?1:a&&b==1||!a&&!b?2:3;
}
map<int,int>f[N];
int n,x[N],y[N],w[N];
int main(){
scanf("%*d%*d%d",&n),s1=n,s2=n+1;
for(int i=0;i<n;++i){
scanf("%d%d%d",y+i,x+i,w+i);
f[x[i]][y[i]]=i;
}
for(int i=0;i<n;++i){
int x=::x[i],y=::y[i];
if(!jud(x,y))
ins(s1,i,w[i]);
else if(jud(x,y)==1)
ins(i,s2,w[i]);
else
for(int j=0;j<4;++j){
int nx=x+dx[j],ny=y+dy[j];
int z=jud(nx,ny);
map<int,int>::iterator k=f[nx].find(ny);
if(k!=f[nx].end())
if(!z)
ins(k->second,i,inf);
else if(z==1)
ins(i,k->second,inf);
else if(z==3)
ins(i,k->second,min(w[i],w[k->second]));
}
}
printf("%d\n",bfs());
}

BZOJ4824 老C的键盘

把BZOJ3167粘过来改改就好了。

#include<algorithm>
#include<cstdio>
using namespace std;
typedef unsigned long long ll;
const int p=1e9+7;
const int N=100;
ll f[N][N],g[N],c[N][N];
int n,e[N][N],r[N];
void dfs(int u,int l){
r[u]=f[u][0]=1;
for(int v=0;v<n;++v)
if(e[u][v]&&v!=l){
dfs(v,u);
fill(g,g+n,0);
for(int i=0;i<r[u];++i)
if(~e[u][v])
for(int j=1;j<=r[v];++j)
(g[i+j]+=f[u][i]*f[v][j-1]%p*c[i+j][j]%p*c[r[u]+r[v]-i-j-1][r[v]-j])%=p;
else
for(int j=0;j<r[v];++j)
(g[i+j]+=f[u][i]*f[v][j]%p*c[i+j][j]%p*c[r[u]+r[v]-i-j-1][r[v]-j])%=p;
copy(g,g+n,f[u]);
r[u]+=r[v];
}
if(~e[u][l])
for(int i=r[u]-2;~i;--i)
(f[u][i]+=f[u][i+1])%=p;
else
for(int i=1;i<r[u];++i)
(f[u][i]+=f[u][i-1])%=p;
}
char w[N];
int main(){
for(int i=0;i<N;++i){
c[i][0]=1;
for(int j=1;j<N;++j)
c[i][j]=(c[i-1][j]+c[i-1][j-1])%p;
}
scanf("%d%s",&n,w);
for(int i=1;i<n;++i){
int u=(i+1)/2-1;
if(w[i-1]=='<')
e[i][u]=1,e[u][i]=-1;
else
e[u][i]=1,e[i][u]=-1;
}
dfs(0,0);
printf("%d\n",f[0][0]);
}

CQOI2017 部分题解的更多相关文章

  1. bzoj 4822~4824 CQOI2017题解

    老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...

  2. 【题解】CQOI2017老C的键盘

    建议大家还是不要阅读此文了,因为我觉得这题我的解法实在是又不高效又不优美……只是想要记录一下,毕竟是除了中国象棋之外自己做出的组合dp第一题~ 首先如果做题做得多,比较熟练的话,应该能一眼看出这题所给 ...

  3. 【题解】CQOI2017老C的方块

    网络流真的是一种神奇的算法.在一张图上面求感觉高度自动化的方案一般而言好像都是网络流的主阵地.讲真一开始看到这道题也有点懵,题面很长,感觉很难的样子.不过,仔细阅读了题意之后明白了:我们所要做的就是要 ...

  4. 题解【[CQOI2017]小Q的棋盘】

    切了水题十分快乐~ 首先发现本题结构一定是颗树~ 本题样例1: ..没啥用? 样例2: 这个时候我们发现:根据贪心思想我们希望每次走一步都多走一个点,如果我们选择最长链的话,在链上每走一步就多走了一个 ...

  5. [CQOI2017]老C的键盘

    [CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...

  6. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  7. 【BZOJ4822】[CQOI2017]老C的任务(扫描线)

    [BZOJ4822][CQOI2017]老C的任务(扫描线) 题面 BZOJ 洛谷 题解 没有修改操作,都不需要分治了... 直接排序之后扫描线算贡献就好了... 不知道为啥洛谷上过不了... #in ...

  8. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  9. 贪心(qwq)习题题解

    贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...

随机推荐

  1. Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?

    I see pretty much all the answers recommend deleting the lock. I don't recommend doing that as a fir ...

  2. openssl之EVP系列之11---EVP_Verify系列函数介绍

    openssl之EVP系列之11---EVP_Verify系列函数介绍     ---依据openssl doc/crypto/EVP_VerifyInit.pod翻译和自己的理解写成     (作者 ...

  3. C# Http方式下载文件到本地

    下文代码是从网络(http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html)得来,亲测好用.我中修改了下格式和注释,版权属于原作者“舒 ...

  4. java 发送微信客服消息

    package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...

  5. 通过jstl判断是否给value 赋值

    <input type="text" name="saler.password" id="password"  value=" ...

  6. 深入浅出WPF----第五章----控件与布局

    你可以把控件想象成一个容器,容器里装的东西就是它的内容.控件的内容可以直接是数据,也可以是控件.当控件的内容还是控件的时候就形成了控件的嵌套.我们把被嵌套的控件称为子级控件,这种控件嵌套在U1布局时尤 ...

  7. 计算机的一些经典书籍CS经典书单

    c++: <c++程序设计> <c++primer> <effective c++> <more effective c++> <深入探索c++对 ...

  8. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  9. Codeforces 490F Treeland Tour 树上的最长上升子序列

    题目链接:点击打开链接 题意: 给定n个点的树. 以下n个数表示点权. 以下n-1行给出树. 找一条链,然后找出这条链中的点权组成的最长上升子序列. 求:最长上升子序列的长度. 思路: 首先是维护一条 ...

  10. 【每日Scrum】第二天(4.23) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天觉得整个界面不适合后期功能扩展,所以进行了整体整改 今天主要看了多事件处理的内容然后改了下界面, 遇到的困难就是正在寻找用户交互性比较好的 ...