CF-div2--149

A.直接暴力两重循环即可。


/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;

const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);

const double eps=1e-10;
const double pi=acos(-1.0);

#define pb push_back   //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))


template<class T> inline T gcd(T a,T b)//NOTES:gcd(
  {if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
  {if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}


typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。

//******* WATER ****************************************************************



int main() {
    int x, y, a, b;
    scanf("%d%d%d%d", &x, &y, &a, &b);
    int n = 0;
    VPII vpii;
    for(int i = a; i <= x; i++) {
        for(int j = b; j <= y; j++) {
            if(i > j) {
                n++;
                vpii.push_back(make_pair(i, j));
            }
        }
    }
    printf("%d\n", n);
    for(int i = 0; i < n; i++) {
        printf("%d %d\n", vpii[i].first, vpii[i].second);
    }
    return 0;
}

B.

先找出最左端和最右端的点,然后查找有没有线段能够覆盖这个左右点组成的线段即可。

/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;

const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);

const double eps=1e-10;
const double pi=acos(-1.0);

#define pb push_back   //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))


template<class T> inline T gcd(T a,T b)//NOTES:gcd(
  {if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
  {if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}


typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。

//******* WATER ****************************************************************

int main() {
    int n;
    int num = -1;
    scanf("%d", &n);
    int maxx = INF_MIN;
    int minn = INF_MAX;
    VPII vpii;
    for(int i = 0; i < n; i++) {
        int tmp1, tmp2;
        scanf("%d%d", &tmp1, &tmp2);
        vpii.push_back(make_pair(tmp1, tmp2));
        if(tmp1 > maxx) maxx = tmp1;
        if(tmp2 > maxx) maxx = tmp2;
        if(tmp1 < minn) minn = tmp1;
        if(tmp2 < minn) minn = tmp2;
    }
    for(int i = 0; i < vpii.size(); i++) {
        if(vpii[i].first <= minn && vpii[i].second >= maxx) num = i+1;
    }
    printf("%d\n", num);
    return 0;
}


C.传统的BFS,注意的就是关于STL的应用。

map用于存放那些数据已经获得了其中的dis

set用于存放所有点。

/*
思考:
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;

const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);

const double eps=1e-10;
const double pi=acos(-1.0);

#define PB push_back   //a.pb( )
#define MP make_pair   //a.mp( )
#define X first
#define Y second
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++ )

template<class T> inline T gcd(T a,T b)//NOTES:gcd(
  {if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
  {if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}


typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//下,左下,左,左上,上,右上,右,右下。

//******* WATER ****************************************************************

map<PII, int> dis;//记录所有的已知的距离,相当于确认是否入过队列
set<PII> s;//记录所有可能的点

int main() {
    int x0, x1, y0, y1, n, r, a, b;
    scanf("%d%d%d%d%d", &x0, &y0, &x1, &y1, &n);
    for(int i = 0; i < n; i++) {
        scanf("%d%d%d", &r, &a, &b);
        for(int i = a; i <= b; i++) {
            s.insert(MP(r, i));
        }
    }

    queue<PII> q;
    dis[MP(x0, y0)] = 0;
    q.push(MP(x0, y0));
    //cout << dis[MP(x1, y1)] << endl;
    while(!q.empty()) {
        //cout << "here" << endl;
        int x = q.front().X;
        int y = q.front().Y;
        q.pop();
        int d = dis[MP(x, y)];
        for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) {
            PII np;
            np.X = x + i; np.Y = y + j;
            if(dis.count(np) || !s.count(np)) continue;
            dis[np] = d + 1;
            q.push(np);
           // printf("%d\n", dis[np]);
        }
    }
    if(!dis[MP(x1, y1)]) puts("-1");
    else printf("%d\n", dis[MP(x1, y1)]);
    return 0;
}












D.直接贪心模拟,如果相等就加一,如果邻居中有相等的继续加1

/*
˼����
*/
#include<iostream>
#include<cstdlib>
#include<vector>
#include<map>
#include<cstring>
#include<set>
#include<string>
#include<algorithm>
#include<sstream>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
#include<queue>
#include<ctime>
//#include<conio.h>
using namespace std;

const int INF_MAX=0x7FFFFFFF;
const int INF_MIN=-(1<<30);

const double eps=1e-10;
const double pi=acos(-1.0);

#define pb push_back   //a.pb( )
#define chmin(a,b) ((a)<(b)?(a):(b))
#define chmax(a,b) ((a)>(b)?(a):(b))


template<class T> inline T gcd(T a,T b)//NOTES:gcd(
  {if(a<0)return gcd(-a,b);if(b<0)return gcd(a,-b);return (b==0)?a:gcd(b,a%b);}
template<class T> inline T lcm(T a,T b)//NOTES:lcm(
  {if(a<0)return lcm(-a,b);if(b<0)return lcm(a,-b);return a*(b/gcd(a,b));}
template<class T> inline void CLR(priority_queue<T, vector<T>, greater<T> > &Q){
    while (!Q.empty()) Q.pop();}
inline int random(int l, int r){return rand() % (r - l + 1) + l;}

typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
int dir_4[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
int dir_8[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
//�£����£������ϣ��ϣ����ϣ��ң����¡�

//******* WATER ****************************************************************


#define N 100005

struct node {
    int id, a;
}nd[N];

int b[N];

bool cmp_1(node a, node b) {
    return a.id < b.id;
}

bool cmp_2(node a, node b) {
    return a.a < b.a;
}

VI adj[N];
VI ans;
int n, m;

void debug() {
    for(int i = 0; i < n; i++) {
        cout << b[i] << " " ;
    }
    cout << endl;
}

void solve(int k) {
    ans.pb(k+1);
    b[k]++;
    for(int i = 0; i < adj[k].size(); i++) {
        int ad = adj[k][i];
        b[ad]++;
        if(b[ad] == nd[ad].a) solve(ad);
    }
}


int main() {
    memset(b, 0, sizeof(b));
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        adj[a-1].pb(b-1);
        adj[b-1].pb(a-1);
    }
    for(int i = 0; i < n; i++) { scanf("%d", &nd[i].a); nd[i].id = i; }
    for(int i = 0; i < n; i++) {
        if(nd[i].a == b[i]) {
            solve(i);
        }
    }
    printf("%d\n", ans.size());
    for(int i = 0; i < ans.size(); i++) {
        i == 0 ? printf("%d", ans[i]) : printf(" %d", ans[i]);
    }
    return 0;
    /*
    bool flag = false;
    int a_c = 0;
    for(int i = 0; i < n; i++) if(b[i]) a_c++;
    printf("%d\n", a_c);
    for(int i = 0; i < n; i++) {
        if(flag) printf(" ");
        if(b[i]) {
            printf("%d", b[i]);
            flag = true;
        }
    }
    */
    /*
    sort(nd, nd + n, cmp_2);
    for(int i = 0; i < n; i++) {
        int ad = nd[i].id;
        if(nd[i].a == b[ad]) {
            b[ad]++;
            ans.pb(ad);
            for(int j = 0; j < adj[ad].size(); j++) {
                int add = adj[ad][j];
                b[add]++;
            }
        }
        //debug();
    }
    /*
    bool flag = false;
    for(int i = 0; i < n; i++) {
        //if(flag) printf(" ");
        //if(b[i]) { printf("%d", b[i]); flag = true; }
    }

    printf("%d\n", ans.size());
    for(int i = 0; i < ans.size(); i++) {
        i == 0 ? printf("%d", ans[i]+1) : printf(" %d", ans[i]+1);
    }
    puts("");
    */
    return 0;
}

E. 线段树区间反转

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值