Codeforce 217 div2
C
假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作;
一直迭代下去直到只剩下1种颜色;
再将这一种颜色与之前交换过的交换就行了,只要保证不会交换出同色手套即可.
bool cmp(node x,node y) {return x.t<y.t;}
void add2ans(int l,int r,int t)
{
// printf("add:l=%d r=%d t=%d\n",l,r,t);
rep(i,t) ans.push_back((node){l,r});
}
int modify(int c,int t,int& res)
{
vector<node>tmp;
tmp.clear();
// printf("c=%d t=%d\n",c,t);
rep(i,(int)ans.size()) if (ans[i].t!=c && ans[i].c!=c)
{
tmp.push_back((node){c,ans[i].t});
// printf("ans[%d].l=%d ans[%d].r=%d\n",i,ans[i].c,i,ans[i].t);
ans[i].t = c;
if ((int)tmp.size()==t) break;
}
rep(i,(int)tmp.size()) ans.push_back(tmp[i]);
// rep(i,(int)tmp.size()) printf("l=%d r=%d\n",tmp[i].c,tmp[i].t);
res = (int)ans.size();
return (int)tmp.size();
}
int main()
{
// freopen("test","r",stdin);
scanf("%d%d",&n,&m);
rep(i,n)
{
int t;
scanf("%d",&t);
cnt[t]++;
}
rep(i,m+) if(cnt[i]) rcd.push_back((node){i,cnt[i]});
sort(rcd.begin(),rcd.end(),cmp);
int res=-;
rep(i,(int)rcd.size()) if(rcd[i].t)
{
int use = rcd[i].t;
if (i==(int)rcd.size()-) use -= modify(rcd[i].c,rcd[i].t,res);
// printf("i=%d use=%d c=%d t=%d\n",i,use,rcd[i].c,rcd[i].t);
rcd[i].t -= use;
add2ans(rcd[i].c,rcd[rcd.size()-].c,use);
for (int j=i+ ; j<(int)rcd.size() ; j++ )
{
rcd[j].t -= use;
add2ans(rcd[j].c,rcd[j-].c,use);
}
}
if (res==-) res = (int)ans.size();
printf("%d\n",res);
rep(i,(int)ans.size()) printf("%d %d\n",ans[i].c,ans[i].t);
return ;
}
D
找到所有w的位置就可以确定正方形的变长,然后枚举左下角,用"部分和"的办法o(1)检查是否合法即可.
E
首先发现:如果"第a天是看i本书的第x天,第b天是看j本书的第y天"成立时,当且仅当(b-a)属于某个区间[l,r];
l,r可以O(1)计算,于是根据输入的n条信息,可以推出f[i][j]=true/false,它表示第i天,是看某本书的第j天.
其中f[1][1]=true,至于这是第几本书,可以根据输入计算出来,然后枚举最后一本书的编号即可.
#define maxn 200010
#define INF 100000
struct node
{
int day,id;
};vector<node>p;
int n,arr[maxn];
bool f[maxn][];
bool check(node a,int x,node b,int y)
{
if (a.id==b.id) return b.day-a.day==y-x;
else
{
int k = b.id-a.id,dif=b.day-a.day;
int l,r;
if (x==) l=+(k-)*+y,r=+(k-)*+y;
else l=(k-)*+y,r=(-x)+(k-)*+y;
return (l<=dif && dif<=r);
}
}
void printans()
{
for (int i= ; i<=n ; i++ ) printf("%d%c",arr[i],i==n?'\n':' ');
}
void getans(int book,int day,int read,int i)
{
int t;
for ( t= ; t<read ; t++ ) arr[day-t]=book;
while(i>=&&p[i].day>=day-t+)i--;
if (i<) return;
t = day-read;
node a = (node){t,book-};
for (int x= ; x<= ; x++ )
for (int y= ; y<= ; y++ ) if (f[p[i].day][x] && check(p[i],x,a,y))
{
getans(a.id,a.day,y,i);
return;
}
}
void solv()
{
if (arr[]>) {printf("-1\n"); return;}
arr[]=;
for (int i= ; i<=n ; i++ ) if(arr[i]) p.push_back((node){i,arr[i]});
f[][]=true;
rep(i,(int)p.size()-)
{
node a=p[i],b=p[i+];
for (int j= ; j<= ; j++ ) if(f[a.day][j])
for (int k= ; k<= ; k++ )
if (check(a,j,b,k)) f[b.day][k]=true;
}
for (int ans=INF ; ans>= ; ans-- )
{
node x = p[p.size()-];
for (int i= ; i<= ; i++ )
{
for (int j= ; j<= ; j++ )
if(f[x.day][j] && check(x,j,(node){n,ans},i))
{
getans(ans,n,i,p.size()-);
printf("%d\n",ans);
printans();
return;
}
}
}
printf("-1\n");
}
Codeforce 217 div2的更多相关文章
- Codeforce Round #217 Div2
e,妈蛋,第二题被hack了 没理解清题意,- -居然也把pretest过了,- -# A: 呵呵! B:包含任意一个子集的输出NO!,其他输出YES! C:贪心额,类似上次的Topcoder的500 ...
- codeforce 192 div2解题报告
今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...
- Codeforce 287 div2 C题
题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- Codeforce 220 div2
D 插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++; 删除i: 找到第i个1的位置,赋为0; 于是转化为一个维护区间和的问题; trick: 如果是依次删除a[0],a ...
- Codeforce 218 div2
D 一开始想错了,试图用"前缀和-容量"来求从上层流下来了多少水",但这是错的,因为溢出可能发生在中间. 然后发现对于每层,溢出事件只会发生一次,所以可以用类似并查集的办 ...
- Codeforce 216 div2
D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
- codeforce 459 DIV2 D题
题意 在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...
- codeforce 382 div2 E —— 树状dp
题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...
随机推荐
- zepto笔记
$.contains: 判断节点是否存在的很好方式[另一个提供类似功能的函数是has] $.grep: 过滤数组 $.type: 获取变量类型 $.closest: 返回最先匹配到的祖先元素 $.ma ...
- (转) xcodebuild和xcrun自动化编译ipa包 笔记
转自:http://blog.csdn.net/totogo2010/article/details/8883100 打包过程 xcodebuild负责将工程源文件编译成xxx.app xcrun负责 ...
- MATLAB获取“非免驱的相机或者摄像头”的图像数据
Image Acquisition Toolbox™ Adaptor Kit 图像採集工具箱 当要使用MATLAB获取"非免驱的相机或者摄像头"的图像数据时,须要开发一个插件,MA ...
- somethings about QSplitter
m_splitter = new QSplitter(Qt::Horizontal); m_splitter->addWidget(this->m_leftWidget); m ...
- 理解JavaScript中作用域链的关系
javascript里的关系又多又乱.作用域链是一种单向的链式关系,还算简单清晰:this机制的调用关系,稍微有些复杂:而关于原型,则是prototype.proto和constructor的三角关系 ...
- iOS 点击cell下拉
iOS 点击cell下拉 代码如下: #import "ViewController.h" @interface ViewController ()<UITableView ...
- SQL server 2008无法修改表
长久未使用SQL server,一直都是使用Navicat来处理各种数据库,感觉使用很方便,但由于实际需要,必须要用SQL server创建新的数据库,却意外的遇到了以前从未遇到过的问题. 在建好表以 ...
- mysql数据修改-DEDE
update `dede_arctype` set `templist`='{style}/products.htm' where `templist`='{style}/Product.htm' d ...
- jQuery读取JSON总结
1.jQuery 部分 <script src="js/jquery.js" type="text/javascript"></script& ...
- django settings最佳配置
# encoding=utf-8 import os import socket SITE_ID = 1 # 项目的根目录 # 简化后面的操作 PROJECT_ROOT = os.path.dirna ...