Day4

第一题,暴力偏分成功。。。正解应该用线段树

正解:

#include <iostream>
#include <stdio.h>
using namespace std;
int n, m;
struct Node {
int sum , tag , l , r;
Node() {
sum = 0;
tag = 0;
}
}t[1000010];


int query(int now, int l, int r) {
if (l <= t[now].l && r >= t[now].r)
return t[now].sum;
int mid = (t[now].l + t[now].r) >> 1;
if (t[now].tag) {
t[now].tag = 0;


if (t[now * 2].l != 0) {
t[now * 2].sum = t[now * 2].r - t[now * 2].l + 1 - t[now * 2].sum;
t[now * 2].tag = !t[now * 2].tag;
}


if (t[now * 2 + 1].l != 0) {
t[now * 2 + 1].sum = t[now * 2 + 1].r - t[now * 2 + 1].l + 1 - t[now * 2 + 1].sum;
t[now * 2 + 1].tag = !t[now * 2 + 1].tag;
}
}
if (r <= mid)return query(now * 2, l, r);
else if (l >= mid + 1)return query(now * 2 + 1, l, r);
else return query(now * 2, l, mid) + query(now * 2 + 1, mid + 1, r);
}


void modify(int now, int l, int r) {
if (l <= t[now].l && r >= t[now].r) {
t[now].sum = t[now].r - t[now].l + 1 - t[now].sum;
t[now].tag = !t[now].tag;
return;
}
int mid = (t[now].l + t[now].r) >> 1;
if (t[now].tag) {
t[now].tag = 0;
if (t[now * 2].l != 0) {
t[now * 2].sum = t[now * 2].r - t[now * 2].l + 1 - t[now * 2].sum;
t[now * 2].tag = !t[now * 2].tag;
}


if (t[now * 2 + 1].l != 0) {
t[now * 2 + 1].sum = t[now * 2 + 1].r - t[now * 2 + 1].l + 1 - t[now * 2 + 1].sum;
t[now * 2 + 1].tag = !t[now * 2 + 1].tag;
}
}
if (r <= mid) {
modify(now * 2, l, r);
}
else if (l >= mid + 1) {
modify(now * 2 + 1, l, r);
}
else {
modify(now * 2, l, mid);
modify(now * 2 + 1, mid + 1, r);
}
t[now].sum = t[now * 2].sum + t[now * 2 + 1].sum;
}


void build(int now, int l, int r) {
if (r < l)return;
if (l == r) {
t[now].l = t[now].r = l;
return;
}
t[now].l = l;
t[now].r = r;
int mid = (t[now].l + t[now].r) >> 1;
build(now * 2, l, mid);
build(now * 2 + 1, mid + 1, r);
}


int main() {
freopen("seq.in", "r", stdin);
freopen("seq.out", "w", stdout);
cin >> n >> m;
int x, y, c;
build(1 , 1 , n);
for (int i = 1; i <= m; ++i) {
//cin >> c >> x >> y;
scanf("%d%d%d" , &c , &x , &y);
if (c) {
cout << query(1, x, y) << endl;
}
else {
modify(1, x, y);
}
}
fclose(stdin);fclose(stdout);
return 0;

}

第儿题

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
struct task{
int d, p;
}d[100010];
bool cmp(task a,task b){
return a.d < b.d;
}
priority_queue<int>q;
int main(){
freopen("ddl.in" , "r" , stdin);freopen("ddl.out" , "w" , stdout);
int n , cnt = 0;
long long ans = 0;
scanf("%d" , &n);
for (int i = 1 ; i <= n ; ++i)
scanf("%d%d" , &d[i].d , &d[i].p);
sort(d + 1 , d + n + 1 , cmp);
for (int i = 1 ; i <= n ; ++i){
ans += d[i].p;
++cnt;
q.push(-d[i].p);
if(d[i].d < cnt){
--cnt;
ans += q.top();
      q.pop();
}
}
cout<<ans<<endl;
fclose(stdin);fclose(stdout);
return 0;

}  

三:

#include <iostream>
#include <stdio.h>
using namespace std;
int n, m;
int f[2010] = {};
int getfather(int x) {
if (x == f[x])return x;
return f[x] = getfather(f[x]);
}
int main() {
freopen("truth.in" , "r" , stdin);
freopen("truth.out" , "w" , stdout);
cin >> n >> m;
char c; int x, y, fx, fy , ffx , ffy;
for (int i = 1; i <= 2 * n; ++i)f[i] = i;
int i;
for (i = 1; i <= m; ++i) {
cin >> x >> y >> c;
fx = getfather(x);
fy = getfather(y);
ffx = getfather(x + n); //对立面
ffy = getfather(y + n); //对立面

if (c == 'L') {
if (fx == fy || ffx == ffy)break;
f[fx] = ffy;
f[ffx] = fy;
}
else {
if (fx == ffy || ffx == fy)break;
f[fx] = fy;
f[ffx] = ffy;
}
}
cout << i - 1 << endl;
fclose(stdin);fclose(stdout);

}

还有40分策略:

#include <iostream>
#include <stdio.h>
using namespace std;
int n, m;
int f[1010] = {}; //  T:1001 F:1002 
int getfather(int x) {
if (x == f[x])return x;
return f[x] = getfather(f[x]);
}
int main() {
freopen("truth.in" , "r" , stdin);
freopen("truth.out" , "w" , stdout);
cin >> n >> m;
char c; int x, y, fx, fy;
f[1001] = 1001;
f[1002] = 1002;
for (int i = 1; i <= n; ++i)f[i] = i;
int i;
for (i = 1; i <= m; ++i) {
cin >> x >> y >> c;
fx = getfather(x);
fy = getfather(y);
if (fx <= 1000 && fy <= 1000) {
f[fx] = 1001;
if (c == 'T')f[fy] = 1001;
else f[fy] = 1002;
continue;
}
if (fx > 1000 && fy > 1000) {
if (fx == 1001) {
if (c == 'T' && fy == 1001)continue;
if (c == 'L' && fy == 1002)continue;
break;
}
else{
if (c == 'T' && fy == 1002)continue;
if (c == 'L' && fy == 1001)continue;
break;
}
}
if (fx > 1000) {//x情况已知
if (fx == 1001) {
if (c == 'T')f[fy] = 1001;
else f[fy] = 1002;
}
else {
if (c == 'L')f[fy] = 1001;
else f[fy] = 1002;
}
}
if (fy > 1000) {//y情况已知
if (fy == 1001) {
if (c == 'T')f[fx] = 1001;
else f[fx] = 1002;
}
else {
if (c == 'L')f[fx] = 1001;
else f[fx] = 1002;
}
}
}
cout << i - 1 << endl;

 

}

第四题:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;


int N, c[100010] = {}, p[100010] = {}, S[100010] = {};


bool cmp(int pa, int pb) {
return c[pa] < c[pb];
}


inline int lowbit(int n) {
return n & (-n);
}


int sum(int n) {
int ret = 0;
while (n>0) {
ret += S[n];
n -= lowbit(n);
}
return ret;
}


void modify(int n, int delta) {
while (n <= N) {
S[n] += delta;
n += lowbit(n);
}
}


int main() {
freopen("photo.in", "r", stdin);
freopen("photo.out", "w", stdout);
cin >> N;
for (int i = 1; i <= N; ++i) {
cin >> c[i];
p[i] = i;
S[i] = 0;
}
sort(p + 1, p + N + 1, cmp);
for (int i = 1; i <= N; ++i)c[p[i]] = i;


long long ans = 0;
for (int i = N; i >= 1; --i) {
ans = ans + (long long)sum(c[i] - 1);
modify(c[i], 1);
}
cout << ans << endl;
fclose(stdin);fclose(stdout);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值