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. 最简单的基于FFmpeg的AVDevice例子(屏幕录制)

    =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...

  2. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  3. Java数组与函数的结合

    import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ // Scann ...

  4. 手机广告投放(phone advertising)唯一标识

    手机标示,为了识别用户,方面advertising. 使用设备id,相当于暴露用户隐私.慢慢已不允许使用.. (长时间跟踪用户无异于暴露用户隐私,虽然大量数据适合兴趣建模,广告个性化推荐.但复杂多样会 ...

  5. 分布式进阶(十三)Docker Container间实现数据共享

    sudo docker run -it -v /usr/lib:/usr/lib/dbdata --name dbcontainer-192.168.1.184 ubuntu:14.04 sudo d ...

  6. HTML5进阶(二)HBuilder实现软件自动升级

    HBuilder实现软件自动升级 前言 移动APP开发好后需要实现软件自动升级功能,经过一番搜索,发现HBuilder具有"App资源在线升级更新"的功能,遂研究之. 经过一番测试 ...

  7. 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)

    膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

  8. 关于iOS socket的讲解介绍

    socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程 ...

  9. Linux下简易线程池

    线程池简介 线程池是可以用来在后台执行多个任务的线程集合. 这使主线程可以自由地异步执行其他任务.线程池通常用于服务器应用程序. 每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会 ...

  10. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...