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. RTB--Real TimeBidding模式的互联网广告(实时竞价的广告投放)

    RTB(real time bidding)实时竞价允许广告买家根据活动目标.目标人群以及费用门槛等因素对每一个广告及每次广告展示的费用进行竞价.竞价成功后获得广告展示机会,在展示位置上展示广告. 其 ...

  2. Cocos2D:塔防游戏制作之旅(七)

    用这3个变量,你可以创建多种不同类型的炮塔,它们可以有着不同的攻击属性,比如长距离重型攻击力,但是慢速攻击的炮塔,或者是渴望快速攻击但是攻击范围近的炮塔. 最后,代码包括了一个draw方法,它在炮塔周 ...

  3. 【一天一道LeetCode】#93. Restore IP Addresses

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  4. 【一天一道LeetCode】#84. Largest Rectangle in Histogram

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...

  5. 9.6、Libgdx之罗盘

    (官网:www.libgdx.cn) 有些Android和iOS设备可能需要检测使用罗盘检测方向. 注意:罗盘当前在iOS设备中不可用,RoboVM暂不支持. 查询当前罗盘当前是否可用: boolea ...

  6. matlab学习日志之并行运算

    原文地址:matlab并行计算,大家共同学习吧,涉及到大规模数据量处理的时候还是效果很好的 今天搞了一下matlab的并行计算,效果好的出乎我的意料. 本来CPU就是双核,不过以前一直注重算法,没注意 ...

  7. Cocos2d中update与fixedUpdate的区别(二)

    关于update:方法的目的 update:方法的目的在于给你一个更新你的游戏(你游戏中的所有对象,标签等待)的机会,在它们被渲染到屏幕之前. 换句话说,如果你想要一些游戏对象显示在屏幕的特定位置,你 ...

  8. 关于精灵帧(Sprite Frame)的尺寸大小

    一个对象的精灵帧(Sprite Frame)有若干关于大小的尺寸. 比较容易混淆,这里记录下来区别: CCSpriteFrame *spriteFrame = self.spriteFrame; CG ...

  9. 生产者消费者的java实现

    先看最简单的,也就是缓冲区的容量为1 缓冲区容量为1 import java.util.List; public class ProducerAndConsumer2 { static class A ...

  10. Android性能优化典例(一)

    在Android开发过程中,很多时候往往因为代码的不规范.api使用不恰当.控件的使用场景考虑不全面和用户不恰当的操作等都能引发一系列性能问题的,下面就是我目前整理的一些Android开发过程中需要注 ...