只会做T1,FallDream T2 n^2暴力AC,太强啦。

T1.Modern Art

题目大意:有一个n*n的矩阵,一开始都是0,你有n^2种颜色,编号1到n^2,每次可以选出一种颜色涂满一个子矩阵(如果已涂则覆盖),每种颜色有且涂一次,给定最终矩阵的颜色,问有几种颜色可能是第一个涂上去的。(n<=1000)

思路:我们把最终每种颜色的最左最右最上最下当作这种颜色的边界,如果一种颜色的某个格子在超过1个边界内(即在除了自己颜色所在的边界的边界),那么这种颜色不可能是第一个涂的,二维前缀和解决即可,复杂度O(n^2)。

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 1000
vector< pair<int,int> > v[MN*MN+];
int f[MN+][MN+];
int main()
{
freopen("art.in","r",stdin);
freopen("art.out","w",stdout);
int n=read(),i,j,x,cnt=-,x0,y0,x1,y1;
for(i=;i<=n;++i)for(j=;j<=n;++j)if(x=read())
{
if(!v[x].size())++cnt;
v[x].push_back(make_pair(i,j));
}
if(!cnt)return *printf("%d",n*n-);
for(i=;i<=n*n;++i)if(v[i].size())
{
x0=y0=;x1=y1=;
for(j=;j<v[i].size();++j)
x0=min(x0,v[i][j].first),y0=min(y0,v[i][j].second),
x1=max(x1,v[i][j].first),y1=max(y1,v[i][j].second);
++f[x0][y0];--f[++x1][y0];--f[x0][++y1];++f[x1][y1];
}
for(i=;i<=n;++i)for(j=;j<=n;++j)f[i][j]+=f[i-][j]+f[i][j-]-f[i-][j-];
for(i=,cnt=;i<=n*n;++i)
{
for(j=;j<v[i].size();++j)
if(f[v[i][j].first][v[i][j].second]>)break;
if(j==v[i].size())++cnt;
}
printf("%d",cnt);
fclose(stdin);fclose(stdout);return ;
}

T2.Switch Grass

题目大意:给定一张n个点m条边的无向图,边有边权,点有颜色,q次操作,每次操作修改一个点的颜色并询问当前图中最近的两个颜色不同点的距离。(n,m,q<=200,000)

思路:首先最近的两个颜色不同点一定是相邻的点,并且一定都在这张图的最小生成树的一条边上(如果走多条边或者非最小生成树边,都容易证明必然有更优解)。先找出最小生成树,随便定个根,我们维护每个点连向他儿子的答案,可以用3种堆维护,第一种每个点对儿子的每种颜色都建一个,维护这种颜色中最近的儿子,第二种每个点建一个,维护这个点到儿子中最近的颜色和次近的颜色(若最近的颜色与该节点颜色相同则取次近作为答案),第三种维护各个点的答案,每次修改依次更新父亲的堆和答案,再更新一下自己的答案,总复杂度O(nlogn)。懒得打堆都用set代替了,结果T了一个点,发现存答案的堆可以用线段树代替,然后就过了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=(x<<)+(x<<)+c-'';
return x;
}
#define MN 200000
#define N 262144
#define INF 0x7FFFFFFF
#define p(x,y) make_pair(x,y)
struct Edge{int x,y,w;}E[MN+];
bool cmp(Edge a,Edge b){return a.w<b.w;}
struct edge{int nx,t,w;}e[MN*+];
int f[MN+],h[MN+],en,c[MN+],fa[MN+],tf[MN+],cnt,t[N*+];
set<pair<int,int> >stc[MN*+],stf[MN+];
set<pair<int,int> >::iterator it;
map<int,int> mp[MN+];
int gf(int k){return f[k]?f[k]=gf(f[k]):k;}
inline void ins(int x,int y,int w)
{
e[++en]=(edge){h[x],y,w};h[x]=en;
e[++en]=(edge){h[y],x,w};h[y]=en;
}
inline void change(int k,int x){for(t[k+=N]=x;k>>=;)t[k]=min(t[k<<],t[k<<|]);}
void dfs(int x)
{
int i,v;
stf[x].insert(p(INF,));
for(i=h[x];i;i=e[i].nx)if(e[i].t!=fa[x])
{
fa[e[i].t]=x;tf[e[i].t]=e[i].w;dfs(e[i].t);
if(v=mp[x][c[e[i].t]])stf[x].erase(p(stc[v].begin()->first,c[e[i].t]));
else stc[v=mp[x][c[e[i].t]]=++cnt].insert(p(INF,));
stc[v].insert(p(e[i].w,e[i].t));
stf[x].insert(p(stc[v].begin()->first,c[e[i].t]));
}
it=stf[x].begin();if(it->second==c[x])++it;
change(x,it->first);
}
void renew(int x,int z)
{
if(fa[x])
{
int v=mp[fa[x]][c[x]];
stf[fa[x]].erase(p(stc[v].begin()->first,c[x]));
stc[v].erase(p(tf[x],x));
stf[fa[x]].insert(p(stc[v].begin()->first,c[x]));
if(v=mp[fa[x]][z])stf[fa[x]].erase(p(stc[v].begin()->first,z));
else stc[v=mp[fa[x]][z]=++cnt].insert(p(INF,));
stc[v].insert(p(tf[x],x));
stf[fa[x]].insert(p(stc[v].begin()->first,z));
it=stf[fa[x]].begin();if(it->second==c[fa[x]])++it;
change(fa[x],it->first);
}
it=stf[x].begin();if(it->second==(c[x]=z))++it;
change(x,it->first);
}
int main()
{
freopen("grass.in","r",stdin);
freopen("grass.out","w",stdout);
int n,m,k,q,i;
n=read();m=read();k=read();q=read();
for(i=;i<=m;++i)E[i].x=read(),E[i].y=read(),E[i].w=read();
sort(E+,E+m+,cmp);
for(i=;i<=m;++i)if(gf(E[i].x)!=gf(E[i].y))f[gf(E[i].x)]=gf(E[i].y),ins(E[i].x,E[i].y,E[i].w);
for(i=;i<=n;++i)c[i]=read();
memset(t,,sizeof(t));dfs();
while(q--)i=read(),renew(i,read()),printf("%d\n",t[]);
fclose(stdin);fclose(stdout);return ;
}

USACO 2017 US Open的更多相关文章

  1. [USACO 2017 Dec Gold] Tutorial

    Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...

  2. NC24083 [USACO 2017 Dec P]Greedy Gift Takers

    NC24083 [USACO 2017 Dec P]Greedy Gift Takers 题目 题目描述 Farmer John's nemesis, Farmer Nhoj, has N cows ...

  3. USACO 2017 February Platinum

    第二次参加USACO 本来打算2016-2017全勤的 January的好像忘记打了 听群里有人讨论才想起来铂金组三题很有意思,都是两个排列的交叉对问题 我最后得分889/1000(真的菜) T1.W ...

  4. [USACO] 2017 DEC Bronze&Silver

    link:http://www.usaco.org/index.php?page=dec17results Problem A(Bronze) 这是一道非常简单的判断重叠面积的题目,但第一次提交仍会出 ...

  5. USACO 2017 February Gold

    那天打cf前无聊练手 T1.Why Did the Cow Cross the Road 题目大意:N*N的矩阵,从左上角走到右下角,走一步消耗T,每走3步消耗当前所在位置上的权值,求最小消耗 思路: ...

  6. USACO 2017 January Platinum

    因为之前忘做了,赶紧补上. T1.Promotion Counting 题目大意:给定一个以1为根的N个节点的树(N<=100,000),每个节点有一个权值,对于每个节点求出权值比它大的子孙的个 ...

  7. USACO 2017 FEB Platinum mincross 可持久化线段树

    题意 上下有两个位置分别对应的序列A.B,长度为n,两序列为n的一个排列.当Ai == Bj时,上下会连一条边.你可以选择序列A或者序列B进行旋转任意K步,如 3 4 1 5 2 旋转两步为 5 2 ...

  8. USACO 2017 FEB Gold visitfj 最短路

    题意 有一幅n*n的方格图,n <= 100,每个点上有一个值.从(1,1)出发,走到(n,n),只能走四联通.每走一步花费t,每走三步需要花费走完三步后到达格子的值.求最小花费的值. 拆点,d ...

  9. USACO 2017 FEB Platinum nocross DP

    题目大意 上下有两个长度为n.位置对应的序列A.B,其中数的范围均为1~n.若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边.现要求在边与边不相交的情况下的最大的连边 ...

随机推荐

  1. alpha-咸鱼冲刺day7

    一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在写登陆+注册ing 注册搞出来了!!!!!!!!QAQ(喜极而泣!!!!.jpg) 四,问题困难 数据流程大概是搞定了.不过 ...

  2. day9

    Alpha冲刺Day9 一:站立式会议 今日安排: 经过为期5天的冲刺,基本完成企业人员模块的开发.因第三方机构与企业存在委托的关系.第三方人员对于风险的自查.风险列表的展示以及自查风险的统计展示(包 ...

  3. Flask 学习 九 用户资料

    资料信息 app/models.py class User(UserMixin,db.Model): #...... name = db.Column(db.String(64)) location ...

  4. 【iOS】swift-获取webView的高度

        func webViewDidFinishLoad(webView: UIWebView) {         let webHeightStr = webView.stringByEvalu ...

  5. 服务器数据恢复_服务器xfs数据丢失数据恢复

    简介:太原一家公司的服务器出现故障,服务器是linux服务器,连接了一台某型号的存储,文件系统为xfs文件系统.管理员使用xfs_repair工具试图对文件系统进行修复但修复失败,linux服务器中所 ...

  6. RAID6三块硬盘离线导致的数据丢失恢复过程

    小编我最近参与了一例非常成功的数据恢复的案例,在这里分享给大家.用户是一组6块750G磁盘的 RAID6,先后有两块磁盘离线,但维护人员在此情况下依然没有更换磁盘,所以在第三块硬盘离线后raid直接崩 ...

  7. 【技巧】Java工程中的Debug信息分级输出接口及部署模式

    也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...

  8. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  9. Xdebug的优点!php代码开发

    可以跟踪函数,知道那个函数出错,之前只是输出一点调试信息,只是哪一行错了,并且是白色 如果是死循环,debug会对死循环判断一百次的循环,并且会给出每一次循环的时间,内存,和函数名,位置.根据时间可以 ...

  10. Linux命令及lamp搭建

    单纯属于Linux的命令:1.强制卸载有依赖关系的软件包: rpm -e httpd-2.2.15-26.el6.x86_64 --nodeps(--nodeps表示无依赖)4.删除当前目录所有的文件 ...