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. Unity2D Sprite灰白图(Unity3D开发之十一)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=596 昨晚看到群里问到2DSpr ...

  2. pig limit 少于10行,会返回所有记录

    my = limit g_log 3; STORE my INTO '/user/wizad/tmp/my' USING PigStorage(','); 这样会返回g_log的所有记录. 要大于等于 ...

  3. memcached 详解

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  4. 挖掘频繁项集之FP-Growth算法

    http://blog.csdn.net/pipisorry/article/details/48918007 FP-Growth频繁项集挖掘算法(Frequent-Pattern Growth, 频 ...

  5. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法

    http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  6. android官方技术文档翻译——Case 标签中的常量字段

    本文译自androd官方技术文档<Non-constant Fields in Case Labels>,原文地址:http://tools.android.com/tips/non-co ...

  7. spring mvc接收List集合、JUI传JSP List

    JUI页面是这样的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <div class=&quo ...

  8. FreeMarker 生成Java、mybatis文件

    FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...

  9. 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画

     1 关于常见的对话框,主要有: 常见的对话框,单选对话框,多选对话框,进度条对话框(转圈类型的),带进度条的对话框. 案例结构: 完成如下结构的案例,将所有的案例都测试一下: 2 编写MainA ...

  10. 新手自定义view练习实例之(一) 泡泡弹窗

    转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50455412 本系列是为新手准备的自定义view练习项目(大牛请无视),相信在学习过程 ...