triangle(第8届山东省赛的某题)

传送门

题意:喵了个呜,这题意真是峰回路转啊。懒死了,不想描述。

做法:我们拿set或线段树维护exp的最小值,每次取出exp值最小的边,删除之。并更新这条边所在的三元环的另外两条边的exp. nice(每次取出的边)就等于前缀最大值啦。

set维护版本

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstring>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
#define rd(x) scanf("%d",&x)
#define prt(x) printf("%d\n", x);
#define prtvec(v) for(int i=0;i<v.size();i++) printf("%d%c", v[i], i==(v.size()-1)?'\n':' ');
#define sz(x) (int)x.size()
#define pb(x) push_back(x)
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define per(i,y,x) for(int i=y;i>=x;i--)
const int N=5000+10;
const double EPS = 1e-8;
vector<int> g[N];
struct Edge {
int from,to,exp,id;
bool operator < (const Edge & o) const {
if(exp==o.exp) {
return id < o.id;
}
return exp < o.exp;
}
};
int T,n,m,u[N],v[N],mx,ans[N],vis[N];
int number[N][N]; Edge edge[N][N];
set<Edge> st;
void init() {
st.clear();
rep(i,1,n) g[i].clear();
rep(i,1,n) rep(j,1,n) number[i][j]=0;
rep(i,1,n) vis[i]=0;
mx=0;
}
int main(){
rd(T);
while(T--) {
rd(n), rd(m);
init();
rep(i,1,m) {
rd(u[i]), rd(v[i]);
g[u[i]].pb(v[i]); g[v[i]].pb(u[i]);
number[u[i]][v[i]]=number[v[i]][u[i]]=i;
}
rep(i,1,m) {
int x=u[i];
int y=v[i];
Edge e; e.from=x,e.to=y,e.exp=0;e.id=i;
rep(j,1,n) vis[j]=0;
for(int j=0;j<g[x].size();j++) if(g[x][j] != y && g[x][j] != x) vis[g[x][j]] = 1;
for(int j=0;j<g[y].size();j++) if(vis[g[y][j]]==1) e.exp ++;
edge[x][y]=edge[y][x]=e;
st.insert(e);
}
while (st.size()) {
Edge e = *st.begin(); st.erase(e);
int x=e.from;
int y=e.to; number[x][y]=number[y][x]=0;
mx = max(mx, e.exp);
for(int i=1;i<=n;i++) {
if(x==i || y==i) continue;
if(number[x][i] && number[y][i]) {
st.erase(edge[x][i]); edge[x][i].exp --, edge[i][x].exp--; st.insert(edge[x][i]);
st.erase(edge[y][i]); edge[y][i].exp --; edge[i][y].exp--; st.insert(edge[y][i]);
}
}
ans[e.id] = mx;
}
rep(i,1,m) {
printf("%d\n", ans[i]);
}
}
}

线段树维护版本

#include <iostream>
#include <bitset> using namespace std;
typedef pair<int,int> pii;
const int N=10000+10;
bitset<2002> g[N],B; int s[N],a[N];
int n,m,u[N],v[N],ans[N];
int id[2002][2002];
void build(int l,int r,int rt){
if(l==r){
s[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
s[rt]=min(s[rt<<1],s[rt<<1|1]);
}
void update(int l,int r,int rt,int pos,int x){
if(l==r) {
s[rt] = x;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(l,mid,rt<<1,pos,x);
else
update(mid+1,r,rt<<1|1,pos,x); s[rt]=min(s[rt<<1],s[rt<<1|1]);
}
pii query(int l,int r,int rt) {
if (l==r) {
return make_pair(l, s[rt]);
}
int mid = (l+r)>>1;
if (s[rt<<1] < s[rt<<1|1])
return query(l,mid,rt<<1);
else
return query(mid+1,r,rt<<1|1);
}
int main() {
int T; scanf("%d",&T);
while (T --) {
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) id[i][j]=0;
for(int i=1;i<=m;i++) {
g[i].reset(); a[i] = 0;
}
for(int i=1;i<=m;i++) {
scanf("%d%d",&u[i],&v[i]);
g[u[i]][v[i]] = 1;
g[v[i]][u[i]] = 1;
id[u[i]][v[i]] = i;
id[v[i]][u[i]] = i;
}
for(int i=1;i<=m;i++) {
int x=u[i]; int y=v[i];
B = g[x] & g[y];
for(int j=1;j<=n;j++) {
if(j==x||j==y||B[j]==0) continue;
a[i] ++;
}
}
build(1,m,1);
int mx = 0;
for(int i=1;i<=m;i++) {
pii tmp = query(1,m,1);
mx = max(mx, tmp.second);
ans[tmp.first] = mx;
int x=u[tmp.first];
int y=v[tmp.first]; id[x][y]=id[y][x]=0;
B=g[x]&g[y];
for(int j=1;j<=n;j++) {
if(j==x||j==y||B[j]==0) continue;
if(id[j][x]==0||id[j][y]==0) continue;
update(1,m,1,id[j][x],--a[id[j][x]]);
update(1,m,1,id[j][y],--a[id[j][y]]);
}
update(1,m,1,tmp.first,N);
}
for(int i=1;i<=m;i++) {
printf("%d\n", ans[i]);
}
}
}

Triangle (第8届山东省赛的某题)的更多相关文章

  1. 第十届山东省赛L题Median(floyd传递闭包)+ poj1975 (昨晚的课程总结错了,什么就出度出度,那应该是叫讨论一个元素与其余的关系)

    Median Time Limit: 1 Second Memory Limit: 65536 KB Recall the definition of the median of elements w ...

  2. 2018年第九届山东省ACM省赛总结

    去年打完区域赛之后,面对着两个队友都去找实习的情况,我自己对今年省赛还是有点慌的.不只一次的像我的队友说明自己很慌,但是老曹跟会长都说:“没事,慌啥!”前几场训练赛因为老曹跟秋洁有面试有时候只能一个人 ...

  3. 第一届山东省ACM——Phone Number(java)

    Description We know that if a phone number A is another phone number B’s prefix, B is not able to be ...

  4. 第一届山东省ACM——Balloons(java)

    Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...

  5. 第七届河南省赛10403: D.山区修路(dp)

    10403: D.山区修路 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 69  Solved: 23 [Submit][Status][Web Bo ...

  6. 第七届河南省赛10402: C.机器人(扩展欧几里德)

    10402: C.机器人 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 53  Solved: 19 [Submit][Status][Web Boa ...

  7. 第七届河南省赛G.Code the Tree(拓扑排序+模拟)

    G.Code the Tree Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 35  Solved: 18 [Submit][Status][Web ...

  8. 第七届河南省赛B.海岛争霸(并差集)

    B.海岛争霸 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 130  Solved: 48 [Submit][Status][Web Board] D ...

  9. 第七届河南省赛A.物资调度(dfs)

    10401: A.物资调度 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 95  Solved: 54 [Submit][Status][Web Bo ...

随机推荐

  1. [C++学习历程]基础部分 C++中的函数学习

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/20305815 作者:sushengmiyan 一.静态变量: 局部变量是线程到达定义的 ...

  2. 今日成为CSDN认证专家

    认证时写的申请材料: 程序猿一枚毕业于南开工作于上海.喜欢读书,喜欢跑步,激情似火,心静如水. 喜欢编程,喜欢寻根问底各种技术,喜欢在各种新技术中汲取营养. 喜欢分享,因此以一些高质量的博文来回报各位 ...

  3. 从JDK源码角度看线程的阻塞和唤醒

    目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与resume因为存在无法解决的竟态问 ...

  4. mysql聚集索引

    转自http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.html 微软的SQL SERVER提供了两种索引:聚集索引(cluster ...

  5. XML解析之JAXP案例详解

    根据一个CRUD的案例,对JAXP解析xml技术,进行详细的解释: 首先,已知一个xml文件中的数据如下: <?xml version="1.0" encoding=&quo ...

  6. Linux进程模型

    ----原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/01/2617884.html------ Linux进程通过一个task_st ...

  7. (NO.00002)iOS游戏精灵战争雏形(三)

    在Sprite中新建Sprites文件夹,在其中添加Player.cc文件,确保其类型为Sprite. 将其Root节点的CCSprite的精灵帧设置为Image/sprite-2.png,然后打开物 ...

  8. MFC中使用SDL播放音频没有声音的解决方法

    本文所说的音频是指的纯音频,不包含视频的那种. 在控制台中使用SDL播放音频,一般情况下不会有问题. 但是在MFC中使用SDL播放音频的时候,会出现没有声音的情况.经过长时间探索,没有找到特别好的解决 ...

  9. STL常用排序算法介绍

    merge()  以下是排序和通用算法:提供元素排序策略  merge: 合并两个有序序列,存放到另一个序列. #include <iostream> #include <cstdi ...

  10. 【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...