这三题截止现在(2016.3.11)窝居然都是跑的最快的……可啪……

T1 bzoj4418

这题叫做扇形面积并,看到这个名字我就方了,因为我不会计算几何啊QAQ

一看题目,发现是傻逼题……(雾)

又是一个树状数组上二分(辣鸡SHOI)

用BIT维护每个半径出现的次数,然后二分找到第k大的,如果不足k个就是0,然后扫一遍就完了

另外我没看懂m<=10^6的意义……因为这个条件完全用不到……

另外这题我手里的考场版本(众所周知窝是大弱省SH的选手)是说a1<a2……然后数据又有a1>a2……辣鸡出题人颓我时间!辣鸡SHOI吃枣药丸!(大雾

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 400005 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
bool flag=0;
while (ch<'0'||ch>'9'){
flag=ch=='-';
ch=getchar();
}
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return flag?-ret:ret;
} struct BIT{
int c[N];
void clear(){memset(c,0,sizeof(c));}
int lowbit(int x){return x&-x;}
void modify(int pos,int delta){
for (int i=pos;i<=100000;i+=lowbit(i))c[i]+=delta;
}
int solve(int value){
int x=0,now=0;
for (int i=(1<<16);i;i=(i>>1))
if (x+i<=100000&&now+c[x+i]<=value)
now+=c[x+=i];
return x;
}
} bit; struct node{
int pos,r,claris;
node(){}
node(int _pos,int _r,int _claris):pos(_pos),r(_r),claris(_claris){}
} a[N];
inline bool operator <(const node &x,const node &y){
return x.pos<y.pos;
}
int n,K; int main(){
int n0=read(),m0=read();K=-read();n=0;
while (n0--){
int x=read(),a1=read(),a2=read();
a[++n]=node(a1,x,1);
a[++n]=node(a2,x,-1);
if (a1>a2){
a[++n]=node(-m0,x,1);
a[++n]=node(m0,x,-1);
}
}
sort(a+1,a+n+1);
bit.clear();
ll ans=0;
for (int i=1;i<n;++i){
K+=a[i].claris;
bit.modify(a[i].r,a[i].claris);
if (a[i].pos==a[i+1].pos||K<0) continue;
ll tmp=bit.solve(K)+1;
ans+=tmp*tmp*(a[i+1].pos-a[i].pos);
}
printf("%lld\n",ans);
return 0;
}

T2 bzoj4419

这题叫做发微博……有普及组水平的肯定能秒了这个题啦!

我们计算每次加/删好友对答案的贡献,我们倒过来做(顺过来肯定可以,我懒得想了而已),用一个数组维护每个人发的微博数。

对于每一条加好友信息u+v,对u的答案有当前v发过的微博数的贡献,反之亦然。

对于删好友,取负即可。

由于每次加/删好友都是合法的,所以这个算法的正确性是显然的。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 500005 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} int op[N],u[N],v[N];
int sum[N],ans[N];
int n,m; int main(){
n=read();m=read();
for (int i=1;i<=m;u[i++]=read()){
char ch=getchar();
while (ch!='!'&&ch!='-'&&ch!='+')ch=getchar();
op[i]=ch!='-'?ch=='+':-1;
if (op[i]) v[i]=read();
}
memset(sum,0,sizeof(sum));
memset(ans,0,sizeof(ans));
for (int i=m;i;--i)
if (op[i]){
ans[u[i]]+=op[i]*sum[v[i]];
ans[v[i]]+=op[i]*sum[u[i]];
}
else sum[u[i]]++;
for (int i=1;i<n;++i) printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 0;
}

T3 bzoj4420

这题叫做二重镇……看完题我就想吐槽,这不就是个消除游戏吗!辣鸡出题人尽我食粮!(雾

这题看规模就知道是状压DP(咦…怎么又考状压…辣鸡SHOI吃枣药丸!)

然后听说这题是码农题,我觉得顶多算个普及组级别的码农题(?)NOIP2015的斗地主都比这个题难写啊……

先dfs找出所有状态,以及各个状态加各物品能延伸到的状态和得分

这里有个小优化,把所有能消除的状态全部剪掉,大概能剪掉2/5吧

其实这里还有一个小优化,不过我没有做(反正测速已经rank1了?),就是把对称的状态全部剪掉,这样又能剪掉将近一半

然后,我们用dp[i][k][mask]表示已经处理了前i个物品,仓库里是物品k,当前状态是mask的最大得分,很显然能脑补转移,然后这题就做完了

(不能脑补转移的,看我代码里的int DP(){}里有很详细的转移姿势)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 8
#define L 105
#define MASK 33333 using namespace std;
inline void Max(int &x,int y){if (y>x) x=y;} int bin[N];
int id[666669],cnt;
int n,len;
int getcode(int *a,int lastpos,int &point){
point=0;
for (;a[lastpos];){
int l=lastpos,r=lastpos,tmp=a[lastpos];
while (l>1&&a[l]==a[l-1]) --l;
while (r<n&&a[r]==a[r+1]) ++r;
if (l==r) break;
point+=(r-l+1)*bin[tmp];
for (int i=l;i<=r;++i) a[i]=0;
a[lastpos]=(tmp+1)%6;
}
int tmp=0;
for (int i=1;i<=n;++i) (tmp*=10)+=a[i];
if (!id[tmp]) id[tmp]=cnt++;
return id[tmp];
} int a[N],b[N];
int dgr[MASK],edge[MASK][N][N],pnt[MASK][N][N];
void dfs(int u){
if (u>n){
int now=getcode(a,0,b[0]);
for (int i=1;i<=n;++i)if (!a[i]){
++dgr[now];
for (int j=1;j<=5;++j){
for (int k=1;k<=n;++k) b[k]=a[k];
b[i]=j;
edge[now][j][dgr[now]]=getcode(b,i,pnt[now][j][dgr[now]]);
}
}
return;
}
for (int i=0;i<=5;++i)
if (u==1||!a[u-1]||a[u-1]!=i)
a[u]=i,dfs(u+1);
} int dp[L][N][MASK],gd[L];
int DP(){
memset(dp,-1,sizeof(dp));
int ans=dp[0][0][0]=0;
for (int i=0;i<=len;++i)
for (int k=5;k>=0;--k)
for (int mask=0;mask<cnt;++mask)if (dp[i][k][mask]>=0){
if (i<len) for (int j=1;j<=dgr[mask];++j)
Max(dp[i+1][k][edge[mask][gd[i+1]][j]],dp[i][k][mask]+pnt[mask][gd[i+1]][j]);
if (k) for (int j=1;j<=dgr[mask];++j)
Max(dp[i][0][edge[mask][k][j]],dp[i][k][mask]+pnt[mask][k][j]);
else Max(dp[i+1][gd[i+1]][mask],dp[i][k][mask]);
Max(ans,dp[i][k][mask]);
}
return ans;
} int main(){
scanf("%d%d",&n,&len);
for (int i=1;i<=len;++i){
char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
gd[i]=ch-48;
}
for (int i=bin[0]=1;i<=5;++i) bin[i]=bin[i-1]<<1;
memset(dgr,0,sizeof(dgr));cnt=0;
dfs(1);
printf("%d\n",DP());
return 0;
}

ps:听说这场lxlwdgy大爷AK了%%%

pss:这篇文章的标签我直接复制上一篇的再删一个就行了……

bzoj4418&&bzoj4419&&bzoj4420:SHOI2013Day2题解的更多相关文章

  1. 【BZOJ4419】[SHOI2013]发微博(???)

    [BZOJ4419][SHOI2013]发微博(???) 题面 BZOJ 洛谷 题解 一道\(easy\),每个点维护一下要给周围的点加上多上,如果额外连了一个点进来就给他把标记减掉,如果删掉了一条边 ...

  2. 【BZOJ4418】[Shoi2013]扇形面积并 扫描线+线段树

    [BZOJ4418][Shoi2013]扇形面积并 Description 给定N个同心的扇形,求有多少面积,被至少K个扇形所覆盖. Input 第一行是三个整数n,m,k.n代表同心扇形的个数,m用 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

随机推荐

  1. NOIP提高组2010 关押罪犯

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  2. Oracle 多表update

    今天凌晨因为要在数据库里做一些操作,是关于两表关联的update,但语句怎么写都不正确,老是报错,于是心惊肉跳(就怕不能及时完成操作)去查了一下,NND,原来把SQL写成了在SQL Server下面的 ...

  3. css布局多列等高

    css .content{margin:0 auto;width: 600px;border: 3px solid #00c;overflow: hidden;} .left{float: left; ...

  4. Debian8.2 下的软件配置

    Add "ll" to alias: ~/.bashrc里面实际上已经有这个alias,把注释去掉就可以了 小红点(指点杆)的启用 这个版本可以在系统配置里把触摸板关掉, 但是这个 ...

  5. Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. ...

  6. indows 8上强制Visual Studio以管理员身份运行

    http://diaosbook.com/Post/2013/2/28/force-visual-studio-always-run-as-admin-on-windows-8 Windows 8的一 ...

  7. JS添加DOM元素CSS权重BUG

    修改删除table的时候,比如拆分合并单元格,合并全部TR中的某个TD后在拆分还原,即使直接在td标签中设置了td的高宽属性,当td在css文件中设置为宽度auto的时候,不能显示出TD来,显示TD宽 ...

  8. Java 基础【10】 I/O流概念分析整理

    转载地址:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059 java.io 中的流,可以从不同的角度进行分类. 按照数据流的方向不 ...

  9. sql基本命令

    --------------------------------------------------------SQL基本命令开始----------------------------------- ...

  10. HoloLens开发手记 - Vuforia开发概述 Vuforia development overview

    关于Vuforia,开发AR应用的人基本都会熟悉.之前我也写过一篇关于Vuforia开发的博客:Vuforia AR SDK入门 今天这篇博客则主要是谈谈HoloLens使用Vuforia开发混合现实 ...