Luogu P1496 burning red cliff

P1496 burning red cliff

Title:

After Cao Cao pacified the north, in 208 ad, he led a large army to the South and attacked Liu Biao. Liu Biao died before his men and horses arrived in Jingzhou. Liu Cong, his son, was frightened by Cao's powerful voice and sent for surrender.

Sun Quan appointed Zhou Yu as the governor and assigned him 30000 sailors to fight against Cao Cao with Liu Bei.

In November in the middle of winter, the weather suddenly warmed up and there was a southeast wind.

Unexpectedly, the east Wu fleet was about two miles away from the north bank, and ten big ships in front of it suddenly caught fire at the same time. Fire takes advantage of wind and wind helps fire. Ten fire boats, like ten fire dragons, break into Cao Jun's water stronghold. The ships there were all crowded together, unable to hide, and soon burned. In a blink of an eye, a sea of fire had been set on fire.

Cao Cao was so angry that he found you and asked you to drill into the sea of fire and count the length of the burning ships on the chain!

Input format

The first line is an integer N.

In the next N lines, there are two numbers in each line: A[i], B[i], indicating the starting position and ending point of the ship on the catenary.

Output format

Output the total length of the vessel on fire. Ensure that the answer is in the range of 32-bit signed integers.

Example of input and output

Input #1:
3
-1 1
5 11
2 9
Output #1:
11
Description / tips

0<n<20000 -2147483648<a[i],b[i]<2147483648
————————————Here's how to start parsing -————————————

Method 1:

If there is no negative number in this question

It will be very simple

Enter two numbers at a time

From f[a[i]] to f[b[i]]

All assigned to 1

(initial value is 0)

If there are negative numbers

Just another array

Used to handle negative numbers

1.0 code is attached below

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
struct cina
{
    int a;
    int b;
};
cina c[10001];
int n,sum,zd[1000001],fd[1000001];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>c[i].a>>c[i].b;
    for(int i=1;i<=n;i++)
    {
        if(c[i].a<0)
        {
            if(c[i].b<0)
            {
                for(int j=c[i].a;j<=c[i].b;j++)
                {
                    if(fd[-j]!=0)
                    {
                        fd[-j]=0;
                        sum++;
                    }
                }
            }//If it's all negative
            else
            {
                for(int j=c[i].a;j<=-1;j++)
                {
                    if(fd[-j]!=0)
                    {
                        fd[-j]=0;
                        sum++;
                    }
                }
                for(int j=0;j<=c[i].b;j++)
                {
                    if(zd[j]!=0)
                    {
                        zd[j]=0;
                        sum++;
                    }
                }
            }//If the former is a negative number, the latter is a positive number
        }
        else
        {
            for(int j=c[i].a;j<=c[i].b;j++)
            {
                if(zd[j]!=0)
                {
                    zd[j]=0;
                    sum++;
                }
            }
        }//This paragraph is all positive
    }
    cout<<sum<<endl;
    return 0;
}

however

This question has a wide range of data

Array cannot be too large

therefore

This method

Don't rely on it!

Method 2:

After entering

All variables are sorted first

Then it is divided into the following three schemes:

1. If a[i] is less than b[i-1] and b[i] is greater than b[i-1]
ans+=b[i]-b[i-1];
2. If both a[i] and b[i] are smaller than b[i-1]
ans unchanged
3. If both a[i] and b[i] are greater than b[i-1]
ans+=b[i]-a[i]

Here is the 2.0 code

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,a[20001],b[20001],sum,temp,R;
//bool flag=true;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
    for(int i=1;i<=n-1;i++)
    {
    	for(int j=1;j<=n-i;j++)
    	{
  		  	if(a[j]>a[j+1])  
   			{
   		  		temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				temp=b[j];
				b[j]=b[j+1];
				b[j+1]=temp;//b array also changes
   		 	}
		}
	}//sort
	
	//for(int i=1;i<=n;i++) cout<<a[i]<<" "<<b[i]<<endl;
	
	sum=b[1]-a[1];
	R=b[1];
	if(n==1)
	{
		cout<<sum<<endl;
		return 0;
	}
	for(int i=2;i<=n;i++)
	{
		if(a[i]<R) 
		{
			if(b[i]<=R) continue;//Option 2
			else
			{
				sum+=b[i]-R;
				R=b[i];
				continue;
			}//Option 1
		}
		else 
		{
			sum+=b[i]-a[i];
			R=b[i];
		}//Option 3
	}
    cout<<sum<<endl;
    return 0;
}

You will find

First test point

Overtime

The solution is

Change bubble sort to selective sort

Here is the 3.0 code

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,a[20001],b[20001],sum,temp,R;
bool flag=true;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
    for (int i=1;i<=n-1;i++)            
    {
        int k=i;
        for(int j=i+1;j<=n;j++)      
        if(a[j]<a[k])  k=j;
        if(k!=i)                             
        { 
             temp = a[i];
             a[i] = a[k]; 
             a[k] = temp; 
             temp=b[i];
             b[i]=b[k];
            b[k]=temp;
        }
    }//Changed to select sort
	sum=b[1]-a[1];
	R=b[1];
	if(n==1)
	{
		cout<<sum<<endl;
		return 0;
	}
	for(int i=2;i<=n;i++)
	{
		if(a[i]<R) 
		{
			if(b[i]<=R)
				continue;
			else
			{
				sum+=b[i]-R;
				R=b[i];
				continue;
			}
		}
		else 
		{
			sum+=b[i]-a[i];
			R=b[i];
		}
	}
    cout<<sum<<endl;
    return 0;
}

Finally passed!!!

Published 5 original articles, won praise 0, visited 66
Private letter follow

Keywords: less

Added by cityguru on Fri, 07 Feb 2020 13:35:29 +0200